Примитивные типы
Примитивные типы — 8 базовых типов Java. Они хранят простое значение напрямую (не объекты) — это фундамент, на котором стоит всё остальное.
На старте реально нужны пять: int, long, double, boolean, char. Остальные — редко.
Целые числа
intобычные числа25longочень большие9000000000Lshortнебольшие (редко)1000byteкрошечные (редко)−100Дробные числа
doubleдробные (по умолчанию)3.14floatдробные (реже)3.14fСимвол
charодин символ'A'Логический
booleanда / нетtrue⚠️ String — не примитив, это объект (текст). Поэтому пишется с большой буквы.
Главное на старте
- целые —
int, очень большие —long; - дробные —
double; - символ —
char(в одинарных кавычках:'A'), текст —String(в двойных:"Артур"); - да/нет —
boolean.
Копнуть глубже
Сколько памяти занимает каждый тип:
| тип | вес | что вмещает |
|---|---|---|
byte | 1 байт | −128…127 |
short | 2 байта | ±32 тыс |
int | 4 байта | ±2 млрд |
long | 8 байт | ±9 квинтиллионов |
float | 4 байта | дробные, ~7 цифр |
double | 8 байт | дробные, ~15 цифр |
char | 2 байта | один символ |
boolean | ~1 байт | true / false |
Зачем разные типы, почему не сделать один? Это баланс «память ↔ диапазон»:
- Память. Миллион чисел в
long(8 байт) — это 8 МБ, вint— 4 МБ, вbyte— 1 МБ. На больших объёмах разница огромная. - Диапазон.
intне вместит 9 миллиардов (id, время в мс) — нуженlong. А для возраста хватит иbyte. - Точность.
doubleточнее, чемfloat. - Скорость. Меньше памяти → больше данных влезает в кэш процессора → быстрее.
Один тип был бы либо прожорливым (всё long), либо тесным (всё byte). Разные типы — выбираешь под задачу. Для очень больших чисел не забывай суффиксы: long x = 9000000000L;, float f = 3.14f;.
Под капотом
Где живёт примитив, зависит от того, где он объявлен:
- Локальная переменная (в методе) → на стеке → самый быстрый доступ.
- Поле объекта (в классе) → внутри объекта в куче → доступ через ссылку на объект, чуть медленнее.
static-поле → в области класса (Metaspace), одно на все объекты.
Что делает компилятор:
- Поля получают значение по умолчанию автоматически (
int→ 0,boolean→ false). Локальные переменные — нет: не задал значение — ошибка компиляции. static finalпримитив = константа времени компиляции. Компилятор подставляет значение прямо в код (inline) — в рантайме обращения к полю вообще нет, это быстрее всего.static final int MAX = 100;→ везде вместоMAXстоит100.- Поля инициализируются сверху вниз в порядке объявления, до тела конструктора.
Ещё: char на самом деле — число (код символа в Unicode). 'A' равно 65, и его можно складывать: 'A' + 1 даст 66 ('B').
🎤 Закрыл тему, если можешь объяснить:
• какие 8 примитивов и чем String от них отличается;
• зачем нужны разные типы и сколько весит каждый (если дошёл до 2-го слоя);
• чем доступ к локальному примитиву отличается от поля класса (если дошёл до 3-го слоя).
• зачем нужны разные типы и сколько весит каждый (если дошёл до 2-го слоя);
• чем доступ к локальному примитиву отличается от поля класса (если дошёл до 3-го слоя).