Встречается на 56% собеседований по Java

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

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

Как это работает

В Java есть восемь примитивных типов: byte, short, int, long, float, double, boolean, char. Они хранят непосредственно значение и размещаются в стеке (для локальных переменных) или в полях объекта (в куче, но без дополнительных накладных расходов). При присваивании примитива копируется само значение.

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

Основные различия

КритерийПримитивные типыСсылочные типы
ХранениеЗначение в стекеСсылка в стеке, объект в куче
Значение по умолчанию0, false, \u0000 и т.д.null
РазмерФиксированный (например, int — 4 байта)Зависит от структуры объекта
МетодыНетМожно вызывать методы
NullabilityНе могут быть nullМогут быть null
ПроизводительностьБыстрый доступТребуется разыменование ссылки

Пример

java
int a = 5;
int b = a; // копируется значение
b = 10;
System.out.println(a); // 5

class Person {
    String name;
}

Person p1 = new Person();
p1.name = "Alice";
Person p2 = p1; // копируется ссылка
p2.name = "Bob";
System.out.println(p1.name); // Bob

Подводные камни

  • Сравнение ссылочных типов через == сравнивает ссылки, а не содержимое. Для сравнения объектов нужно использовать equals().
  • Примитивные типы нельзя использовать в generics (например, List<int> недопустимо), нужны обёртки (Integer, Long и т.д.).
  • Автоупаковка и распаковка могут приводить к неожиданным результатам при сравнении Integer с int или Integer между собой вне диапазона -128..127.
  • Выбор типа влияет на производительность: примитивы эффективнее по памяти и скорости, но ссылочные типы необходимы для объектно-ориентированного программирования и работы с коллекциями.

Когда использовать

Примитивы выбирают для простых числовых или логических значений, когда важна производительность и нет необходимости в null. Ссылочные типы — для моделирования сложных сущностей, использования полиморфизма, работы с коллекциями и когда нужно явно указать отсутствие значения.

Коротко

  • Примитивы хранят значение, ссылочные — ссылку на объект.
  • Примитивы не могут быть null, ссылочные могут.
  • Примитивы быстрее и занимают меньше памяти.
  • Ссылочные типы поддерживают методы и наследование, но требуют аккуратности при сравнении и копировании.
как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы