Будет ли один и тот же экземпляр объекта в памяти возвращён дважды при создании объекта с одинаковым идентификатором?

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

Ответ

Вопрос требует уточнения, так как в Java Core нет встроенной концепции «создания объекта по идентификатору». Ответ зависит от контекста:

1. Оператор new: При каждом использовании new создаётся новый, уникальный объект в куче, даже если значения его полей идентичны другому объекту.

MyClass obj1 = new MyClass(5);
MyClass obj2 = new MyClass(5);
System.out.println(obj1 == obj2); // false — это разные объекты в памяти.

2. Кеширование/пулы объектов: Некоторые API или паттерны (например, Flyweight) могут возвращать один и тот же экземпляр для одинаковых идентификаторов. Это поведение не является стандартным для языка, а реализуется явно.

  • Пример: Integer.valueOf(int i) кеширует объекты для значений от -128 до 127.
    Integer a = Integer.valueOf(127);
    Integer b = Integer.valueOf(127);
    System.out.println(a == b); // true — это один и тот же кешированный объект.
  • Паттерн Flyweight: Специальная фабрика может хранить созданные объекты в Map и возвращать существующий экземпляр для повторяющегося ключа.

Вывод: По умолчанию (new) — объекты всегда разные. Возврат одного экземпляра — результат явной реализации кеширования в конкретном классе или фабрике.