Ответ
Вопрос требует уточнения, так как в 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 сама за тебя это делать не будет, она не твоя мамка, блядь.