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

Ответ

Вопрос требует уточнения, так как в 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) — объекты всегда разные. Возврат одного экземпляра — результат явной реализации кеширования в конкретном классе или фабрике.

Ответ 18+ 🔞

Да блядь, ну вот опять этот вечный вопрос про "создание объекта по идентификатору" в Java! Слушай, тут всё просто, как три копейки, но люди так загоняются, что мама не горюй.

Вот смотри, в самой Java Core, в её голой жопе, нет никакой волшебной кнопки "создай объект по ID". Это как если бы ты пришёл на завод и сказал: "Дайте мне деталь номер 5". А тебе в ответ: "Какую, сука, деталь? Из какого цеха? Из какого сплава? По какому чертежу?".

1. Оператор new — это наш царь и бог. Каждый раз, когда ты его пишешь, JVM, эта хитрая жопа, идёт в кучу, откусывает кусок памяти и строит там абсолютно новый, уникальный объект. Даже если он, как близнец, похож на другой до каждой запятой — это два разных чувака в памяти. Проверить — раз плюнуть.

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

Видишь? false! Они как два Герасима из одного села — оба здоровые, оба немые, но это два разных мужика, блядь. Один может Муму утопить, а второй — нет.

2. А вот теперь начинается магия, которую делаем мы сами, а не Java. Иногда нам выгодно не создавать нового Герасима, а тырить уже существующего из какого-нибудь сарая. Это называется кеширование или пулы объектов (паттерн Flyweight, если по-умному).

  • Классика жанра: Integer.valueOf(int i). Эта хитрая функция не создаёт новый объект для каждого числа. Для мелких циферок (от -128 до 127) у неё есть тайный чулан, где она их хранит. Спросишь два раза одно и то же — получишь один и тот же объект из чулана.

    Integer a = Integer.valueOf(127);
    Integer b = Integer.valueOf(127);
    System.out.println(a == b); // true — охуеть! Это один и тот же кешированный объект!

    А вот спроси 200 — и она уже лениво сделает нового. Потому что в чулан всё не влезет, ёпта.

  • Паттерн Flyweight — это когда мы этот чулан делаем своими руками. Заводим себе Map, где ключ — это наш "идентификатор", а значение — готовый объект. Приходит запрос: "Дай объект с ID=5". Мы лезем в мапу, а там уже лежит? Отлично, вот тебе, забирай старого. Не лежит? Ну, бля, ладно, создаём нового, в мапу пихаем и отдаём. Всё, экономия памяти — овердохуищная.

Итог, коротко и на пальцах: По дефолту, через new — объекты всегда разные, хоть ты тресни. А вот если тебе нужно, чтобы для одного и того же ID возвращался один и тот же объект — это ты сам, своей рукой, должен организовать этот цирк с кешированием. Java сама за тебя это делать не будет, она не твоя мамка, блядь.