Как Java обрабатывает создание строки, которая уже присутствует в String Pool?

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

Ответ

При создании строки через литерал (String s = "text") JVM сначала проверяет String Pool (область heap memory). Если идентичная строка уже существует, возвращается ссылка на существующий объект из пула. Если нет — строка создается и помещается в пул, после чего возвращается ссылка на новый объект.

Пример с литералами:

String s1 = "hello";
String s2 = "hello";
System.out.println(s1 == s2); // true (обе ссылки указывают на один объект в пуле)

При использовании оператора new создается новый объект в куче (heap), даже если идентичная строка уже есть в пуле. Его можно явно поместить в пул с помощью метода intern().

Пример с new:

String s3 = new String("hello");
String s4 = new String("hello");
System.out.println(s3 == s4); // false (разные объекты в heap)
System.out.println(s3.intern() == s1); // true (s3.intern() возвращает ссылку из пула)

Практическое правило: Используйте строковые литералы для констант и повторяющихся значений, чтобы экономить память. Избегайте new String("literal"), так как это создает лишний объект.