Это то, что происходит:
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, когда он примет решение.
'новый Integer object', вы имеете в виду, что' x' не правда отсылая к it' s оригинальная 'x' ссылка, тогда да (' immutable'). Если вы имеете в виду, что он не ссылается на кешированный «Integer» со значением «6», то нет (в кеше «Целочисленный диапазон»). – SomeJavaGuy
Я бы использовал 'Integer.valueOf()' для получения значений кеша; компилятор тоже может это сделать. –