Для 100 сравнение ссылок гарантированно даст true. Для 300 обычно false, но расширенный кэш Integer может дать true, поэтому полагаться на этот результат нельзя.
Поведение оператора == при сравнении объектов Integer
Для 100 сравнение ссылок гарантированно даст true. Для 300 обычно false, но расширенный кэш Integer может дать true, поэтому полагаться на этот результат нельзя.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Исследовать, как работает сравнение двух объектов типа Integer оператором == при разных значениях. Необходимо объяснить полученные результаты, учитывая внутренний кэш Integer‑ов в диапазоне от -128 до 127.
public class Test2 {
public static void main(String[] args) {
Integer first = 100;
Integer second = 100;
Integer third = 300;
Integer fourth = 300;
System.out.println("first == second: " + (first == second));
System.out.println("third == fourth: " + (third == fourth));
}
}
Ответ
Для 100 сравнение ссылок гарантированно даст true. Для 300 обычно false, но расширенный кэш Integer может дать true, поэтому полагаться на этот результат нельзя.
Автобоксинг использует канонические объекты для обязательного диапазона −128…127; реализация вправе кешировать и дополнительные значения. Оператор == у двух Integer сравнивает ссылки, а equals — числовые значения. Поэтому first.equals(second) и third.equals(fourth) истинны независимо от расширения кеша. При сравнении с примитивным int произойдёт распаковка, но null при этом приведёт к NullPointerException.