Данные в Java хранятся в памяти различными способами:
Примитивные типы: Значения хранятся непосредственно в местах выделенной памяти (например, стек). К ним относятся byte, short, int, long, float, double, boolean, char.
java
Ссылочные типы: В памяти хранится ссылка (адрес), указывающая на место, где находится сам объект (в куче). К ним относятся классы, интерфейсы, массивы.
java
Массивы: Объекты в куче, содержащие набор элементов (либо примитивных значений, либо ссылок на другие объекты). Переменная массива хранит ссылку на этот объект.
java
Объекты: Создаются в куче (Heap). Переменная хранит ссылку на объект. Внутри объекта могут храниться как примитивные значения его полей, так и ссылки на другие объекты.
java
Строки: Объекты класса String, хранятся в куче. Строки являются неизменяемыми (immutable). Их значения часто кешируются в String Pool для оптимизации, когда создаются литералами.
java
Коллекции (List, Set, Map и др.): Объекты, хранящиеся в куче. Содержат ссылки на другие объекты.
java
Стек (Stack): Используется для хранения локальных переменных (примитивных типов), ссылок на объекты и информации о вызовах методов (call stack). Жизненный цикл данных в стеке привязан к вызываемому методу.
Куча (Heap): Используется для хранения всех объектов. Очистка памяти в куче выполняется сборщиком мусора (Garbage Collector).
Таким образом, данные в Java распределены между стеком (для примитивов и ссылок) и кучей (для объектов).