Integer a=127, b=127, c=128, d=128. Что вернут a==b и c==d?
- Почему Integer 127 == 127 true, а 128 == 128 false?
- Что такое кэш Integer?
- Как правильно сравнивать Integer?
a==b → true, c==d → false: Integer.valueOf() кэширует значения от −128 до 127.
- Автоупаковка вызывает valueOf — в диапазоне кэша ссылки совпадают
- Для 128 создаются разные объекты,
==сравнивает ссылки
А ещё Обёртки сравнивают через equals(), а осторожнее всего — с распаковкой null
Подробно
При присваивании 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
- ✗Оба false: == сравнивает ссылки
- ✓a==b → true, c==d → false
- ✗a==b → false, c==d → true
Что спросят дальше
- Зачем нужен Integer cache?
- Чем отличается int от Integer при сравнении?
Разбор темы
- Примитивы, обёртки и Integer cache
Восемь примитивов и их диапазоны, autoboxing, кэш Integer и ловушка ==, NPE при распаковке и цена боксинга.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.