TGViewer
Physics.Math.Code Physics.Math.Code @physics_lib · 147K subscribers
Post #14618 15.1K
🖥 Различия в создании строк на Java

Есть два самых популярных способа создания строк:
1 — String s1 = new String("Hello");
2 — String s2 = "Hello";
Разберем отличия.

▪️ 1. Место в памяти (Самое главное отличие) — Это отличие является корнем всех остальных различий.

🔸String s1 = new String("Hello"); (Оператор new)
➖ Создает новый объект в Куче (Heap), независимо от того, какая строка там уже существует.
➖ Каждый вызов new String("Hello") гарантированно создает новый, уникальный объект в памяти.

🔸String s2 = "Hello"; (Строковый литерал)
➖ Строка создается и помещается в специальную область памяти — String Pool (Пул строк), который находится внутри кучи.
➖ Механизм String Pool: Перед созданием новой строки JVM проверяет, нет ли уже строки с таким же значением в пуле. Если есть — переменной просто присваивается ссылка на существующий объект. Если нет — тогда в пуле создается новый объект.

Наглядная аналогия:
➖ new String("Hello") — покупка нового, уникального экземпляра книги, даже если она уже есть в библиотеке.
➖ "Hello" — взятие книги из библиотеки. Если книга есть — вы получаете именно её. Если нет — библиотека сначала покупает новую, а вы её берете.

▪️ 2. Поведение при сравнении (==). Оператор == сравнивает ссылки на объекты, а не их содержимое. Из-за различий в памяти поведение будет разным.
String s1 = new String("Hello");
String s2 = "Hello";
String s3 = "Hello";

System.out.println(s1 == s2); // false
System.out.println(s2 == s3); // true

➖ s1 == s2 -> false, потому что s1 ссылается на объект в куче, а s2 — на объект в String Pool. Это два разных объекта в памяти.
➖ s2 == s3 -> true, потому что обе переменные ссылаются на один и тот же объект в String Pool.
Для сравнения содержимого строк всегда используйте метод equals():
System.out.println(s1.equals(s2)); // true (сравнивается содержимое "Hello")
System.out.println(s2.equals(s3)); // true


▪️ 3. Производительность

🔸Строковый литерал ("Hello") — более эффективен. Он избегает создания дубликатов в памяти, что экономит память и ускоряет работу, так как не нужно создавать новый объект, если он уже существует в пуле.
🔸Оператор new — менее эффективен. Он принудительно создает новый объект в куче, даже если идентичная строка уже существует. Это может привести к избыточному расходу памяти.

▪️ 4. Количество создаваемых объектов

🔸String s1 = new String("Hello"); — Может создать 1 или 2 объекта.
➖ 1. Строковый литерал "Hello" сначала ищется в String Pool. Если его нет — он создается в пуле. (Первый возможный объект).
➖ 2. Затем ключевое слово new создает новый объект String в куче. (Второй объект).
Таким образом, если строка "Hello" ранее не существовала в пуле, эта строка кода создаст два объекта.
🔸String s2 = "Hello";
➖ Создает 0 или 1 объект.
➖ JVM ищет "Hello" в String Pool. Если находит — объект не создается, переменной присваивается существующая ссылка (0 новых объектов).
➖ Если не находит — создает новый объект в String Pool (1 новый объект).

▪️Метод intern() — мостик между двумя подходами. Метод intern() позволяет вручную поместить строку из кучи в String Pool или получить ссылку на уже существующую там строку.
String s1 = new String("Hello");
String s2 = s1.intern(); // Помещаем строку в пул (или получаем ссылку из пула)
String s3 = "Hello";

System.out.println(s1 == s2); // false, т.к. s1 все еще в куче
System.out.println(s2 == s3); // true, т.к. s2 и s3 ссылаются на один объект в пуле

В этом примере s1.intern() находит строку "Hello" в пуле (которая была создана при вычислении литерала внутри конструктора) и возвращает на неё ссылку, которую мы присваиваем s2.

Практический вывод: Почти всегда следует использовать строковые литералы (String s = "value";). Этот способ более эффективен по памяти и времени, так как использует механизм пула строк. #java #задачи #программирование #собеседования #IT #структуры_данных

💡 Physics.Math.Code // @physics_lib
  • ❤ 38
  • 👍 24
  • 🔥 7
  • 👨‍💻 3
  • ✍ 2
  • ❤‍🔥 2
  • ⚡ 1
More from @physics_lib
  1. Oct 7, 2026😵‍💫 Плоттер, который рисует картинки и даже портреты в полярной системе координат У поля…
  2. Oct 7, 2026🔴 ЗАДАЧА ДНЯ: Геомеханика и теория упругости Представьте, что вы проектируете горный тонн…
  3. Oct 6, 2026🎈 Резиновый шарик в тепловизоре 🔥 Ранее на канале был уже такой опыт. Кратко о происходя…
  4. Oct 6, 2026⚡️ Друзья-подписчики, которые имеют premium-подписку, нужно помочь сообществу голосами, чт…
  5. Oct 6, 2026🔸 Нобелевская премия по физике за 2026 год была присуждена бельгийскому астрофизику Фрэнс…
  6. Oct 5, 2026⚙️ Модель устройства главной части вертолёта 🚁 Несущий винт вертолёта состоит из лопастей…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →