В чем разница между созданием строки через new String() и строковым литералом в Java?

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

Ответ

new String() всегда создает новый объект в куче, даже если идентичная строка уже существует в пуле строк (String Pool). Строковый литерал (например, "text") сначала ищется в пуле строк, и если найден — возвращается ссылка на существующий объект, что экономит память.

Пример:

String a = "hello";      // Использует/создает объект в пуле строк
String b = "hello";      // Возвращает ссылку на тот же объект из пула
String c = new String("hello"); // Создает новый объект в куче

System.out.println(a == b);     // true (один и тот же объект)
System.out.println(a == c);     // false (разные объекты)
System.out.println(a.equals(c)); // true (одинаковое содержимое)

Почему это важно:

  • Пул строк — оптимизация для экономии памяти и быстрого сравнения через ==.
  • new String() может быть полезен в редких случаях, например, для создания независимой копии подстроки, чтобы избежать удержания в памяти большой исходной строки (memory leak).
  • Для сравнения содержимого строк всегда используйте .equals(), а не ==.