Получить доступ

Integer a=127, b=127, c=128, d=128. Что вернут a==b и c==d?

JuniorОсновы языка
Ещё спрашивают так:
  • Почему Integer 127 == 127 true, а 128 == 128 false?
  • Что такое кэш Integer?
  • Как правильно сравнивать Integer?
Коротко

a==b → true, c==d → false: Integer.valueOf() кэширует значения от −128 до 127.

  • Автоупаковка вызывает valueOf — в диапазоне кэша ссылки совпадают
  • Для 128 создаются разные объекты, == сравнивает ссылки

А ещё Обёртки сравнивают через equals(), а осторожнее всего — с распаковкой null

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Попробуйте сами

Песочница: == против equals и кэш Integer

Подробно

При присваивании Integer a = 127 срабатывает автоупаковка: компилятор вызывает Integer.valueOf(127). Этот метод для значений от −128 до 127 возвращает заранее созданные объекты из кэша, поэтому a и b ссылаются на один объект и a == b даёт true.

Для 128 кэш не используется, создаются два разных объекта, а == для ссылочных типов сравнивает ссылки — результат false. Верхнюю границу кэша можно увеличить параметром JVM (-XX:AutoBoxCacheMax), что показывает: поведение == зависит от настроек, а не от значений.

Отсюда правило: значения обёрток сравнивают через equals() или распаковывают в примитивы. Похожие кэши есть у Short, Byte, Long, Character (небольшой диапазон) и Boolean.

Вторая ловушка обёрток — распаковка null: Integer x = null; int y = x; бросает NullPointerException.

Пример

Integer a = 127, b = 127, c = 128, d = 128;
System.out.println(a == b);       // true — один объект из кэша
System.out.println(c == d);       // false — разные объекты
System.out.println(c.equals(d));  // true

Что хотят услышать

  • Верный ответ: true и false.
  • Причина — кэш Integer в диапазоне −128..127 при автоупаковке через valueOf.
  • == сравнивает ссылки, значения сравнивают через equals().
  • Знание про NPE при распаковке null — плюс.

Частые ошибки

  • Сравнивать обёртки через ==.
  • Думать, что кэш бесконечен.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗Оба true
  • ✓a==b → true, c==d → false
  • ✗Оба false
  • ✗a==b → false, c==d → true

Что спросят дальше

  • Зачем нужен Integer cache?
  • Чем отличается int от Integer при сравнении?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем