Что такое примитивные типы данных в Java?

Ответ

Примитивные типы данных (primitive types) в Java — это простые, встроенные в язык типы, которые хранят свои значения непосредственно в переменной (по значению). Они не являются объектами и представляют собой сырые данные.

Характеристики:

  • Хранят значение в стеке (stack memory) или внутри объекта.
  • Имеют фиксированный размер в памяти.
  • Не имеют методов.
  • Не могут быть null (имеют значения по умолчанию).
  • Работа с ними очень эффективна.
Таблица примитивных типов Java: Тип Размер (биты) Диапазон/Значения по умолчанию Класс-обёртка
boolean не определён точно (обычно 1) true / false (по умолчанию false) Boolean
byte 8 от -128 до 127 Byte
char 16 'u0000' до 'uffff' (0 до 65535) Character
short 16 от -32,768 до 32,767 Short
int 32 от -2^31 до 2^31-1 Integer
long 64 от -2^63 до 2^63-1 (суффикс L) Long
float 32 ~1.4e-45 до ~3.4e+38 (суффикс F) Float
double 64 ~4.9e-324 до ~1.8e+308 Double

Примеры объявления:

// Целочисленные типы
byte smallNumber = 100;
short mediumNumber = 30_000;
int age = 30; // Наиболее часто используемый
long bigNumber = 100_000_000_000L; // Требуется суффикс L

// Типы с плавающей точкой
float price = 19.99F; // Требуется суффикс F
double preciseValue = 3.141592653589793; // Тип по умолчанию для дробных

// Символьный и логический типы
char grade = 'A';
boolean isJavaFun = true;

Автоупаковка и автораспаковка (Autoboxing/Unboxing): Начиная с Java 5, компилятор автоматически преобразует примитивы в соответствующие классы-обёртки и обратно, что упрощает код, но требует внимания к производительности и сравнению (== vs .equals()).

Integer boxedInt = 42; // Автоупаковка (int -> Integer)
int primitiveInt = boxedInt; // Автораспаковка (Integer -> int)

Ответ 18+ 🔞

А, вот это тема, блядь! Примитивные типы в Java — это как фундамент, на котором всё держится, а народ про них нихуя не помнит, только объекты да коллекции таскает. Ну-ка, слушай сюда, разжую.

Представь, что примитивы — это как базовые кирпичики, ёпта. Не объекты они, нет. Просто кусок памяти с числом или буквой. Тупо, быстро, без наворотов. В переменной лежит само значение, а не ссылка куда-то, в рот меня чих-пых! Работает это всё на скорости света, потому что компилятору не надо голову ломать над наследованием, полиморфизмом и прочей хуйнёй.

Чем они характерны, эти примитивы:

  • Значение прямо в переменной или в стеке — по значению, а не по ссылке, как эти ваши объекты.
  • Размер фиксированный, как ботинок у солдата — ни байтом больше.
  • Методов у них нихуя, ноль. Нельзя у int вызвать .toString() — он же не объект, дурачок!
  • null им не светит, овердохуища! У них свои дефолтные значения, если не инициализировал. int? Ноль. boolean? false, блядь. Не как у ссылочных — там null и NullPointerException тебе в сраку.
  • Эффективность — пиздец какая. Быстрее только электрический ток.

Вот тебе сводная таблица, чтобы не путаться, как мудак в трёх соснах:

Тип Размер (биты) Что хранит / Дефолт Класс-обёртка (чтобы как объект)
boolean чёрт его знает (часто 1) true / false (по умолчанию false) Boolean
byte 8 от -128 до 127 (малявка) Byte
char 16 символ от 'u0000' до 'uffff' Character
short 16 от -32,768 до 32,767 Short
int 32 от -2^31 до 2^31-1 (рабочая лошадка) Integer
long 64 овердохуищные числа (суффикс L) Long
float 32 числа с плавающей точкой (суффикс F) Float
double 64 ещё более плавающая точка (дефолт для дробей) Double

Как это объявляется, на живых примерах:

// Целые числа, бля
byte мелкота = 100;
short ужеЧутьКрупнее = 30_000;
int возраст = 30; // Его все используют, он как водка — всегда в ходу
long космическоеЧисло = 100_000_000_000L; // Без L в конце — получишь ошибку, лох!

// Дроби, ёпта
float цена = 19.99F; // F не забудь, а то схавает как double и обосрёшься
double точноеЗначение = 3.141592653589793; // По умолчанию все дробные — double

// Остальная хуйня
char оценка = 'A'; // Один символ, в одинарных кавычках!
boolean джаваКрута = true; // Ложь или правда, третьего не дано.

А теперь магия — автоупаковка/распаковка (Autoboxing/Unboxing): С пятой Java умные дядьки придумали, чтобы не париться. Компилятор сам, сука, превращает примитив в объект-обёртку и обратно. Удобно? Да. Но смотри, чтобы не наступил на грабли!

Integer упакованныйInt = 42; // Автоупаковка — компилятор сам сделал new Integer(42)
int примитивныйInt = упакованныйInt; // Автораспаковка — вытащил значение обратно

Смотри только, когда сравниваешь (==), а то наебешь сам себя. == для объектов ссылки сравнивает, а не значения, пидарас шерстяной! Для сравнения значений у обёрток .equals() используй, или распакуй сначала.

Вот и вся философия. Просто, как три копейки, но если не понимать — потом будешь дебажить ебанистические ошибки и охуевать, откуда они взялись.