Может ли примитивный тип данных в Java храниться в куче?

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

Ответ

Да, но не напрямую. Примитивные типы по умолчанию хранятся в стеке вызовов, однако они могут оказаться в куче в двух случаях:

  1. Как поле объекта. Если примитив является полем класса, он хранится в куче вместе с экземпляром этого объекта.

    class Person {
        int age; // Значение 'age' хранится в куче внутри объекта Person.
    }
  2. В результате автоупаковки. Когда примитив используется в контексте, требующем объект (например, добавление в коллекцию Collection<Integer>), он автоматически упаковывается в соответствующий класс-обертку (например, int -> Integer), и этот объект размещается в куче.

    List<Integer> numbers = new ArrayList<>();
    numbers.add(42); // Примитив 42 упаковывается в объект Integer и помещается в кучу.

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