2016-05-19 5 views
1
Integer x = new Integer(5); 
x = x + 1; 

Для приведенного выше фрагмента нового объекта Integer, созданного при выполнении операции x = x + 1?В Java, добавляет/вычитает/размножает/делит примитивный тип на тип с коротким типом, создает новый объект типа boxed?

+0

'новый Integer object', вы имеете в виду, что' x' не правда отсылая к it' s оригинальная 'x' ссылка, тогда да (' immutable'). Если вы имеете в виду, что он не ссылается на кешированный «Integer» со значением «6», то нет (в кеше «Целочисленный диапазон»). – SomeJavaGuy

+0

Я бы использовал 'Integer.valueOf()' для получения значений кеша; компилятор тоже может это сделать. –

ответ

1

Это то, что происходит:

x в Integer x = new Integer(5);Integer - отметить, что не будет никаких новых объектов здесь, объект из кэша Integer будет использоваться!

Выполняется x + 1. Чтобы это произошло, x становится int (unboxing), и теперь вы как int значения 6, который находится в временной переменной.

Далее, бокс произойдет для =. Поскольку Integers кэшируются от -128 до 127, ваш Integer значения 6 не будет создан, но x укажет на объект Integer(6) в этом кеше. Когда мы говорим о значениях вне этого диапазона, будет создан новый объект. Если раньше у вас был x объект Integer со значением вне этого диапазона, этот объект будет удален GC, когда он примет решение.

+1

Я ошибаюсь, думая, что если вы используете новое ключевое слово, у вас будет новый экземпляр ?. Из Integer src. '/ ** * Создает новый выделенный объект {@code Integer}, который * представляет указанное значение {@code int}. * * @param значение, которое должно быть представлено объектом * {@code Integer}. */ public Integer (int value) { this.value = значение; } ' – juanmf

2

Да

Распаковка будет happing, когда появляется арифметические операторы,

Integer x = new Integer(5); 
    x = x + 1; //1) Unboxing will happen to int 5. 2)Addition happens 
          3)Reboxing to new Object -- this will create new Object