2013-09-22 7 views

ответ

6

Существует разница. Первый будет рассматриваться как

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.

2

В первой строке вы пишете

Integer I = 30; 

На первый взгляд вы назначаете целое (все число литералов без явного типа постфикса считаются целыми числами) на объект, вы думаете, что компилятор должен жаловаться о несовместимых типах. Но это не так, тогда это то, где происходит волшебство ->auto boxing! Компилятор автоматически помещает целое число 30 в объект I, т. Е. Создает объект, который удерживает целочисленное значение 30 и присваивает его этой ссылке.

В строке

Integer I = new Integer(30); 

Вы явно использовать new для создания объекта. Поэтому вы не оставляете компилятору никакой возможности что-либо сделать. Собственно, что сделало так уверен, что это auto boxing ??

Кроме того, jvm кэширует диапазон значений для констант, чтобы свести к минимуму память, используемую для этих констант, и, таким образом, повысить производительность. Чтобы использовать эту функцию, вы должны получить экземпляры такого объекта, используя метод valueOf(). В этом случае для одного и того же целочисленного значения возвращается один уникальный объект.Если вы создаете его с помощью new, то для той же константы каждый раз вы получите другой объект.

Смежные вопросы