Я хотел бы знать разницу между этими двумя:Autoboxing - Разница между этими двумя линиями?
Integer I = 30; // is it autoboxing?
Integer I = new Integer(30); // I know it is autoboxing
Я хотел бы знать разницу между этими двумя:Autoboxing - Разница между этими двумя линиями?
Integer I = 30; // is it autoboxing?
Integer I = new Integer(30); // I know it is autoboxing
Существует разница. Первый будет рассматриваться как
Integer I = Integer.valueOf(30); // autoboxing
, который будет использовать Integer
объект уже хранится в кэше внутренней (это верно, когда Autoboxing значения в диапазоне от -127 до 128 включительно). Второй будет явно создавать объект Integer
.
Вы можете увидеть это для себя:
Integer I1 = 30;
Integer I2 = 30;
System.out.println(I1 == I2);
true
против
Integer I1 = new Integer(30);
Integer I2 = new Integer(30);
System.out.println(I1 == I2);
false
В общем, не сравнить Integer
объекты с ==
, так что тесты на равенство ссылок. Я использовал его здесь для проверки, если I1
и I2
относятся к тому же экземпляру. В первом фрагменте они выполняются, потому что Integer
, соответствующий 30
, уже существует в кеше, и этот экземпляр используется и назначается как I1
, так и I2
. Во втором фрагменте они не возникают, так как мы создаем два независимых объекта через new
.
Кстати, во втором случае нет автобоксинга, вы просто создаете простой новый объект. В первом случае есть автобоксинг, потому что int
неявно преобразуется в Integer
.
Фактически вы можете увидеть эффекты автобоксинга, просмотрев скомпилированный байт-код с помощью javap -c MyClass
.
В первой строке вы пишете
Integer I = 30;
На первый взгляд вы назначаете целое (все число литералов без явного типа постфикса считаются целыми числами) на объект, вы думаете, что компилятор должен жаловаться о несовместимых типах. Но это не так, тогда это то, где происходит волшебство ->auto boxing
! Компилятор автоматически помещает целое число 30
в объект I
, т. Е. Создает объект, который удерживает целочисленное значение 30
и присваивает его этой ссылке.
В строке
Integer I = new Integer(30);
Вы явно использовать new
для создания объекта. Поэтому вы не оставляете компилятору никакой возможности что-либо сделать. Собственно, что сделало так уверен, что это auto boxing
??
Кроме того, jvm кэширует диапазон значений для констант, чтобы свести к минимуму память, используемую для этих констант, и, таким образом, повысить производительность. Чтобы использовать эту функцию, вы должны получить экземпляры такого объекта, используя метод valueOf()
. В этом случае для одного и того же целочисленного значения возвращается один уникальный объект.Если вы создаете его с помощью new
, то для той же константы каждый раз вы получите другой объект.
Дело 1: Да. Случай 2: Нет, его создание обычного объекта с помощью ключевого слова 'new'. – rocketboy