Сколько в Java примитивных типов и что хранит char?
- Какие примитивные типы есть в Java?
- Сколько байт занимает char?
- Чем примитив отличается от обёртки?
Примитивов восемь: byte, short, int, long, float, double, char, boolean; char — 16-битный беззнаковый, один UTF-16 code unit.
- Целые 8/16/32/64 бита, float 32, double 64, размер boolean не задан спецификацией
- Эмодзи и редкие символы — два char (суррогатная пара), length() считает char, а не символы
А ещё Переполнение int не бросает исключение — значение «заворачивается»
Подробно
Примитивы хранят значение напрямую, а не ссылку на объект:
| Тип | Размер | Что хранит |
|---|---|---|
| byte | 8 бит | целое −128..127 |
| short | 16 бит | целое |
| int | 32 бита | целое, около ±2,1 млрд |
| long | 64 бита | целое |
| float | 32 бита | число с плавающей точкой |
| double | 64 бита | число с плавающей точкой |
| char | 16 бит | беззнаковый код UTF-16 |
| boolean | не задан | true/false |
char — не «символ» в человеческом смысле, а одна кодовая единица UTF-16. Символы вне базовой плоскости Unicode (эмодзи, часть иероглифов) занимают два char — суррогатную пару. Поэтому "😀".length() равно 2; настоящие символы считают через codePointCount.
Ещё о чём спрашивают: у каждого примитива есть обёртка (Integer, Character…) для коллекций и дженериков; целочисленное переполнение не бросает исключение (Integer.MAX_VALUE + 1 даёт Integer.MIN_VALUE) — для контроля есть Math.addExact; деньги не считают во float/double из-за ошибок округления — берут BigDecimal или копейки в long.
Что хотят услышать
- Все восемь примитивов и их размеры.
- char как 16-битный UTF-16 code unit и суррогатные пары.
- Отличие примитивов от обёрток.
- Переполнение и BigDecimal для денег — плюс.
Частые ошибки
- Считать char способным вместить любой символ Unicode (вне BMP — суррогатная пара).
- Называть String примитивом.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓8 примитивов; char — 16-битный беззнаковый UTF-16 code unit
- ✗8 примитивов; char хранит любой символ Unicode целиком (32 бита)
- ✗9 примитивов, включая String для текста
- ✗7 примитивов; boolean — это int шириной 1 бит
Что спросят дальше
- Почему length() у строки с эмодзи больше числа видимых символов?
- Чем char отличается от code point?
Разбор темы
- Примитивы, обёртки и Integer cache
Восемь примитивов и их диапазоны, autoboxing, кэш Integer и ловушка ==, NPE при распаковке и цена боксинга.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.