Примитивы и обёртки

Тема дорожной карты · Java

Примитивные типы Java — это восемь встроенных, не являющихся объектами типов значений в языке Java: byte, short, int, long, float, double, boolean и char — они хранятся непосредственно в стеке JVM или в полях объектов, а не в куче, что делает их значительно более эффективными по памяти и быстрее в доступе, чем их обёрточные аналоги. Каждый примитивный тип Java имеет фиксированный размер (int — 32-битный, long — 64-битный, double — 64-битный IEEE 754) и соответствующий класс-обёртку (Integer, Long, Double и др.) в java.lang, позволяющий примитивам участвовать в Generics, Collections и конвейерах Stream API через автоупаковку и распаковку. Автоупаковка — автоматическое преобразование между int и Integer — создаёт тонкие проблемы производительности и корректности: ненужные выделения памяти в куче, NullPointerException при распаковке и неожиданные сравнения идентичности через ==; всё это важно распознавать при использовании примитивных типов Java в тесных циклах или Collections. Специализированные типы потоков IntStream, LongStream и DoubleStream в Java Stream API существуют именно для обработки примитивных типов Java без накладных расходов на автоупаковку, а JEP 402 (Value Types / Valhalla) нацелен на то, чтобы в будущем принести производительность, схожую с примитивами, пользовательским классам значений. Твёрдое понимание примитивных типов Java, их диапазонов, правил продвижения и поведения при упаковке — это основа для написания корректного и производительного Java-кода в любом контексте.

Как это работает

Примитивы и обёртки покрывает классы (единица компиляции), примитивные типы (int, long, double, boolean — не объекты), reference-типы (объекты, массивы, String — на heap), управление (if/else, switch — теперь со стрелочной формой и pattern matching в 21+), циклы (for, while, for-each), пакеты + импорты, модификаторы доступа (public/protected/package-private/private). Современная Java: var для type inference (10+), текстовые блоки """...""" (15+), records (16+), sealed classes (17+), pattern matching (21+).

Когда применять

Современные фичи — при таргете 17+: records для DTO (срезает 90% бойлерплейта), var для type-inference локальной переменной (когда RHS очевиден), текстовые блоки для multi-line строк, sealed-типы для закрытых иерархий. var — не для полей и возвратов методов (теряется читаемость). Optional — осторожно; никогда .get() без проверки; используйте .orElse(), .map(), .ifPresent().

Типичные ошибки

Ловушки Примитивы и обёртки: сравнение строк == вместо .equals() (классика); примитивные массивы там, где коллекции лучше; игнор Optional и возврат null (NPE-чума продолжается); String s = ""; for(...) s += x; (квадратично — используйте StringBuilder). Читайте Java-туториал для вашей версии; старые туториалы отстают.

Связанные понятия

Полезные ресурсы