Страницы

Поиск по вопросам

воскресенье, 29 декабря 2019 г.

Сравнение объектов типа Integer Java

#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()

Комментариев нет:

Отправить комментарий