Короткий ответ
В Java два семейства типов. Примитивные: их ровно восемь — byte, short, int, long, float, double, char, boolean; переменная хранит значение прямо «в себе» и методов у него нет. Ссылочные: классы, интерфейсы, массивы и перечисления; переменная хранит ссылку на объект, который размещается в куче.
Как это работает подробнее
Главное различие — что именно копируется при присваивании и где хранятся данные.
- Примитив. При присваивании копируется само значение. Локальные примитивы хранятся в стеке, а примитивные поля — внутри объекта в куче.
- Ссылочный тип. Переменная хранит адрес области памяти, где лежит объект, созданный оператором
new. При присваивании копируется ссылка, и обе переменные указывают на один и тот же объект. - Значения по умолчанию. Поле-примитив по умолчанию получает
0илиfalse, неинициализированная ссылка —null. Когда примитив нужно представить как объект (например, положить в коллекцию), используют классы-обёртки:Integerдляint.
Пример кода
TypesDemo.java
public class TypesDemo {
public static void main(String[] args) {
int a = 42;
int b = a; // копируется значение
b = 100;
System.out.println(a); // 42
int[] arr1 = {1, 2, 3};
int[] arr2 = arr1; // копируется ссылка
arr2[0] = 99;
System.out.println(arr1[0]); // 99
}
}Что использовать на практике
- Для содержимого объектов использовать
equals, а==оставлять для примитивов и проверки ссылок. - В коллекциях и дженериках применять обёртки (
Integer,Double), помня про автораспаковку. - Учитывать память: массив примитивов
int[]компактнее массива обёртокInteger[].
Подводные камни
- Считать, что в Java «всё — объект»: восемь примитивных типов объектами не являются.
- Путать сравнение
==у ссылочных типов: сравниваются ссылки, а не содержимое объектов. - Думать, что примитивы всегда лежат в стеке: примитивные поля живут внутри объекта в куче.
Как отвечать на собеседовании
- Каркас ответа: разделите типы на примитивные и ссылочные → перечислите восемь примитивов → покажите отличие при присваивании (значение против ссылки) → добавьте про хранение в стеке и куче и значения по умолчанию.