int и Integer: в чём разница
Вопрос
Чем int отличается от Integer и когда что использовать?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
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 ошибок.
Термины по теме
Ещё по теме «Основы: типы, обёртки, static»
- char плюс int
- Изменили константу в библиотеке
- Деньги в double
- Ключ Long и get(int)
- final ссылка на список
- Автоупаковка
- Порядок инициализации
- Примитивы Java