Pull to refresh

🤔 Почему в джаве 128 != 128?

Такой код выведет false

Integer i1 = 128;
Integer i2 = 128;
System.out.println(i1 == i2);

Тут все довольно просто, Integer - это объект, а не примитив и он хранится в хипе, поэтому сравнивать тут надо не по ссылке (через ==), а по значению - через i1.equals(i2).

А что выведет этот код?

Integer i1 = 127;
Integer i2 = 127;
System.out.println(i1 == i2);

Тут вернется true.
Дело в том, что у оберток в джаве есть кэш.
Для Integer это [-128;127], поэтому все объекты интов от -127 до +128 равны и по ссылке и по значению.
Для интов размер кэша можно изменить через аргумент JVM XX:AutoBoxCacheMax=size

А что насчет такого кода?

Integer i1 = 127;
Integer i2 = new Integer(127);
System.out.println(i1 == i2);

Здесь будет false 🙂
При создании объекта через new мы создаем новый объект в хипе, который уже не будет равен по ссылке тому, что хранится в кэше.

Но так делать не стоит. Конструктор Integer(int) депрекейтнут.

👨‍💻 Джуниор

Tags:
Total votes 14: ↑14 and ↓0+20
Comments3

Articles