#java #объекты #integer_overflow
Подскажите, пожалуйста, почему данный код выводит в консоль false true public class Test { public static void main(String[] args){ Integer a = 135; Integer b = 135; Integer c = 110; Integer d = 110; System.out.println(a == b); System.out.println(c == d); } } Вроде ж должны сравниваться ссылки на объекты, а они тут все разные
Ответы
Ответ 1
Java по умолчанию кэширует Integer значения из диапазона от -128 до 127. Если число попадает в этот диапазон, то объект создаваться не будет, а будет взят из кэша. В силу этого имеем, что первое сравнение даст false, а второе true. Так же, есть возможность регулировать размер кэша, следующим параметром jvm: -XX:AutoBoxCacheMax=Или же, с -Djava.lang.Integer.IntegerCache.high= Ответ 2
Все правильно. При старте JVM, создается 128 экземпляров Integer для чисел от 0 до 127 включительно. При раcпаковке, если значение в диапазоне от 0 до 127, переменной присваивается сгенерированная при старте JVM ссылка на экземпляр Integer. Если же присваивается значение более 127, то генерируется новый класс и его ссылка присваивается переменной. Операция сравнения сравнивает только ссылки. Получается если число меньше 127, то ссылки ведут на один и тот же экземпляр Integer. Если больше 127, то ссылки ведут на разные экземпляры независимо от их значения. Поэтому сравнивать по значению надо всегда через equals()
Комментариев нет:
Отправить комментарий