🤔 Почему в джаве 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)
депрекейтнут.
👨💻 Джуниор