Поведение оператора == при сравнении объектов Integer

Для 100 сравнение ссылок гарантированно даст true. Для 300 обычно false, но расширенный кэш Integer может дать true, поэтому полагаться на этот результат нельзя.

Короткий ответ

Что ответить на собеседовании

Для 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.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее