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

«В чем разница между примитивными и ссылочными типами данных в Java?» — вопрос из категории Java Core, который задают на 26% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Примитивные типы (например, int, double, boolean) хранят значения напрямую в стеке, имеют фиксированный размер и передаются по значению (при присваивании копируется само значение).

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

Ключевые отличия:

  • Хранение: Примитивы — в стеке, ссылочные — ссылка в стеке, объект в куче.
  • Передача: Примитивы — по значению (копия), ссылочные — по ссылке (копия ссылки).
  • Null: Примитивы не могут быть null, ссылочные — могут.
  • Методы: У примитивов нет методов, у объектов ссылочных типов — есть.
  • Производительность: Работа с примитивами обычно быстрее из-за отсутствия накладных расходов на работу с кучей.

Пример:

// Примитивный тип (передача по значению)
int a = 5;
int b = a; // Копируется значение 5
b = 10;    // Изменяется только b, a остаётся 5
System.out.println(a); // 5

// Ссылочный тип (передача ссылки)
int[] arr1 = {1, 2};
int[] arr2 = arr1; // Копируется ссылка на массив
arr2[0] = 99;      // Изменяется объект в куче
System.out.println(arr1[0]); // 99 (arr1 и arr2 ссылаются на один массив)