Назад к вопросам
Intern
73
questionbank

В чем разница между примитивными и ссылочными типами данных?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

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

Примитивные типы:

  • Занимают фиксированный и небольшой объем памяти.
  • Передаются по значению (копируется само значение).
  • Начинаются с маленькой буквы.
  • Включают: byte, short, int, long, float, double, boolean, char.
// Пример примитивного типа
int a = 10;
int b = a; // Копируется значение 10
b = 20;   // Изменяется только b, a остается 10

Ссылочные типы:

  • Занимают разный объем памяти, зависящий от содержимого объекта.
  • Передаются по ссылке (копируется адрес объекта). Изменение объекта по ссылке влияет на все переменные, ссылающиеся на него.
  • Обычно начинаются с большой буквы (классы).
  • Включают: классы (String, Object, пользовательские классы), интерфейсы, массивы.
// Пример ссылочного типа
String str1 = new String("Hello");
String str2 = str1; // Копируется ссылка на объект "Hello"
str2 = "World";   // str2 теперь ссылается на новый объект "World". str1 по-прежнему ссылается на "Hello".

// Другой пример с мутабельным объектом
ArrayList<Integer> list1 = new ArrayList<>();
list1.add(1);
ArrayList<Integer> list2 = list1; // Копируется ссылка на тот же объект ArrayList
list2.add(2); // Добавляем элемент в объект, доступный через обе ссылки
// Теперь list1 содержит [1, 2] и list2 содержит [1, 2]

Краткая таблица-сравнение:

Свойство Примитивные типы Ссылочные типы
Хранение Значение Ссылка на объект
Передача По значению По ссылке
Размер памяти Фиксированный Переменный
Начинается с Маленькой буквы Обычно с большой буквы
Nullability Не могут быть null Могут быть null

Примитивные типы оборачиваются в соответствующие классы-оболочки (wrapper classes) для работы с ними как с объектами (например, int в Integer).