Ответ вслух Junior Основы: типы, обёртки, static спрашивают часто обновлено

int и Integer: в чём разница

Вопрос

Чем int отличается от Integer и когда что использовать?

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

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

int это примитив: значение лежит прямо в переменной или поле, null быть не может, операции дешёвые. Integer это объект-обёртка в куче.

Что должно прозвучать в ответе

  • int примитив: хранит значение, не может быть null, дешёвый

  • Integer объект-обёртка: может быть null, нужен в коллекциях и дженериках

  • Автоупаковка через Integer.valueOf и кеш -128..127

  • Сравнение Integer через equals, а не ==

  • NPE при распаковке null

  • В горячем коде упаковка даёт лишние объекты и нагрузку на GC

Что могут спросить следом

  • Почему Integer a = 1000, b = 1000; a == b даёт false?
  • Можно ли поменять верхнюю границу кеша?
  • Почему в List<int> нельзя хранить примитивы?

Разбор

int это примитив: значение лежит прямо в переменной или поле, null быть не может, операции дешёвые. Integer это объект-обёртка в куче. Он нужен там, где требуется объект: в коллекциях и дженериках (дженерики не работают с примитивами), и там, где важно отсутствие значения, то есть null. Компилятор сам упаковывает через Integer.valueOf и распаковывает через intValue(). Отсюда две ловушки. Первая: Integer.valueOf кеширует -128..127, поэтому == на маленьких числах случайно работает, а на больших нет; сравниваю через equals. Вторая: распаковка null даёт NPE, например int x = map.get(key). В горячих циклах упаковка создаёт мусор, там беру примитивы или специализированные стримы вроде IntStream.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.