Какие бывают типы данных в Java
Что проверяют
Базу, без которой дальше не поговорить: примитивы против ссылочных типов, размеры, значения по умолчанию, обёртки. Вопрос почти всегда продолжается ловушкой: что выведет Integer a = 128, b = 128; a == b или где хранится int, объявленный полем объекта.
Как отвечать
Типы в Java делятся на две группы. Примитивных ровно восемь, и их размер фиксирован спецификацией, а не платформой:
- целые:
byte(8 бит),short(16),int(32),long(64). Все знаковые, переполнение происходит молча, по кругу; если это важно, естьMath.addExact; - дробные:
float(32 бита) иdouble(64), формат IEEE 754.0.1 + 0.2даёт не ровно0.3, поэтому деньги считают вBigDecimalили в копейках типаlong; char: 16 бит без знака, одна кодовая единица UTF-16. Эмодзи занимает дваchar, так что это не «один символ» в бытовом смысле;boolean:trueилиfalse, размер в памяти спецификация не фиксирует.
Ссылочные типы: классы (включая enum и record), интерфейсы и массивы. Переменная хранит ссылку, значение поля по умолчанию null. У полей-примитивов умолчания 0, false и '\u0000', а локальную переменную без присваивания компилятор использовать не даст.
Мостик между группами: обёртки Integer, Long и остальные, плюс автоупаковка. Она нужна, потому что дженерики работают только со ссылками, List<int> не скомпилируется. Цена упаковки: лишние объекты в памяти и NullPointerException при распаковке null.
Где спотыкаются
Сравнивают обёртки через ==. Integer.valueOf кеширует значения от -128 до 127, поэтому для 127 сравнение даёт true, а для 128 уже false. Сравнивать нужно через equals.
Говорят «примитивы лежат на стеке, объекты в куче». Поле int внутри объекта лежит в куче вместе с объектом, на стеке живут локальные переменные методов.
Считают String примитивом. Это обычный неизменяемый класс, просто со своим литералом и пулом строк.