В Java приведён фрагмент: Integer a = 127; Integer b = 127; System.out.println(a == b); Integer x = 128; Integer y = 128; System.out.println(x == y); Объясните результаты и почему автобоксинг ведёт себя так

10 Мар в 08:46
13 +1
0
Ответы
1
Выведет: для Integer a=127; Integer b=127; System.out.println(a==b);Integer\ a = 127;\; Integer\ b = 127;\; System.out.println(a == b);Integer a=127;Integer b=127;System.out.println(a==b);truetruetrue, а для Integer x=128; Integer y=128; System.out.println(x==y);Integer\ x = 128;\; Integer\ y = 128;\; System.out.println(x == y);Integer x=128;Integer y=128;System.out.println(x==y);falsefalsefalse.
Почему: при автобоксинге компилятор вызывает Integer.valueOf(int)Integer.valueOf(int)Integer.valueOf(int), а не newInteger(...)new Integer(...)newInteger(...). Метод Integer.valueOfInteger.valueOfInteger.valueOf использует кеш для небольших значений (по умолчанию диапазон [−128,127][-128,127][128,127]), поэтому для значений внутри кеша возвращается один и тот же объект — ссылки совпадают, и a==ba == ba==b даёт truetruetrue. Для значений вне кеша создаются разные объекты, поэтому x==yx == yx==y даёт falsefalsefalse.
Важно: оператор ====== для ссылочных типов сравнивает ссылки (объекты). Для сравнения числовых значений используйте a.equals(b)a.equals(b)a.equals(b) или явное распаковку в примитивы (например, a.intValue()==b.intValue()a.intValue() == b.intValue()a.intValue()==b.intValue() или автоматическое unboxing), тогда и для 128128128 сравнение по значению вернёт truetruetrue. Также диапазон кеша можно изменить опцией JVM (например, −XX:AutoBoxCacheMax=<макс>-XX:AutoBoxCacheMax=<макс>XX:AutoBoxCacheMax=<макс>) в некоторых реализациях.
10 Мар в 08:55
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир