← Назад к вопросам

Какие типы данных существуют в Java? Чем отличается объект от примитивных типов данных?

2.0 Middle🔥 151 комментариев
#Docker, Kubernetes и DevOps#JVM и управление памятью

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Типы данных в Java

Две категории типов

Все типы в Java разделяются на две группы:

1. Примитивные типы (Primitive Types)

Базовые встроенные типы, хранящие значения напрямую:

byte myByte = 127;              // 8 бит
short myShort = 32767;          // 16 бит
int myInt = 2147483647;         // 32 бита
long myLong = 9223372036854775807L;  // 64 бита
float myFloat = 3.14f;          // 32 бита
double myDouble = 3.14159;      // 64 бита
char myChar = "A";              // 16 бит (Unicode)
boolean myBool = true;          // true/false

2. Ссылочные типы (Reference Types)

Объекты, на которые ссылаются переменные:

String str = "Hello";           // Класс
Person person = new Person();   // Экземпляр класса
int[] numbers = {1, 2, 3};      // Массив
List<Integer> list = new ArrayList<>();  // Интерфейс
enum Color { RED, GREEN }       // Enum

Таблица примитивных типов

ТипРазмерДиапазонЗначение по умолчанию
byte8 бит-128 до 1270
short16 бит-32768 до 327670
int32 бита-2^31 до 2^31-10
long64 бита-2^63 до 2^63-10L
float32 бита±1.4E-45 до ±3.4E380.0f
double64 бита±4.9E-324 до ±1.8E3080.0
char16 бит0 до 65535"\u0000"
boolean1-8 битtrue/falsefalse

Различия между объектами и примитивами

1. Место хранения

Примитивные типы: находятся в Stack (быстрая память) Объекты: находятся в Heap (медленнее, но больше памяти)

2. Копирование

// Примитив — копирует значение
int x = 5;
int y = x;
y = 10;
System.out.println(x);  // 5 (не изменилось)

// Объект — копирует ссылку
Person p1 = new Person("Alice");
Person p2 = p1;  // оба указывают на один объект
p2.setName("Bob");
System.out.println(p1.getName());  // "Bob" (изменился!)

3. Сравнение

// Примитив — сравнивает значение
int a = 5, b = 5;
System.out.println(a == b);  // true

// Объект — == сравнивает ссылку (адрес)
String s1 = new String("test");
String s2 = new String("test");
System.out.println(s1 == s2);      // false (разные объекты)
System.out.println(s1.equals(s2)); // true (одинаковое содержимое)

4. Значение по умолчанию

public class Example {
    int x;           // примитив: 0
    String str;      // объект: null
    boolean flag;    // примитив: false
    List list;       // объект: null
}

5. Производительность

Примитивные типы: очень быстрые (находятся в Stack) Объекты: медленнее (находятся в Heap, требуют GC)

6. Коллекции

Коллекции требуют ссылочные типы. Для примитивов используются обёртки:

// ❌ Неправильно
List<int> list = new ArrayList<>();  // ОШИБКА!

// ✓ Правильно — используем обёртку Integer
List<Integer> list = new ArrayList<>();
list.add(5);  // автоматическое boxing
Integer value = list.get(0);  // автоматическое unboxing

Таблица обёрток примитивов

ПримитивОбёртка
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean

Пример с Heap и Stack

int age = 25;              // Stack: переменная содержит значение 25
Person person = new Person("Alice", 25);
// Stack: person содержит адрес объекта (например, 0x12345)
// Heap: объект Person с данными (name="Alice", age=25) находится по адресу 0x12345

Ключевые выводы

Примитивные типы — простые значения, быстрые, копируют значение ✓ Объекты — сложные типы, хранятся в Heap, копируют ссылку ✓ Stack vs Heap — примитивы в Stack (быстрее), объекты в Heap (медленнее) ✓ == vs equals — для примитивов == работает, для объектов нужен equals ✓ Null — возможен только для объектов, для примитивов используются обёртки ✓ Коллекции — требуют ссылочные типы (Integer вместо int)

Вывод

Примитивные типы — это быстрые встроенные значения. Объекты — это сложные типы, хранящиеся в памяти Heap, на которые ссылаются переменные. Главная разница: примитивы копируют значение, объекты копируют ссылку на один объект в памяти.