Где хранятся строки (String) в Java?

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

Ответ

Строки в Java хранятся в куче (Heap). Для эффективного использования памяти JVM применяет механизм String Pool (пул строк).

Как это работает:

  1. При создании строки через литерал (String s = "text") JVM ищет идентичную строку в пуле.
  2. Если строка найдена, возвращается ссылка на существующий объект.
  3. Если не найдена, создается новый объект в куче и помещается в пул.

Пример, демонстрирующий разницу:

String literal1 = "hello"; // Помещается в String Pool
String literal2 = "hello"; // Возвращается ссылка из пула (literal1 == literal2 -> true)

String newString = new String("hello"); // Создается новый объект в куче вне пула
// newString == literal1 -> false

String interned = newString.intern(); // Помещаем строку в пул вручную
// interned == literal1 -> true

Ключевые особенности:

  • String Pool расположен в Heap (начиная с Java 7).
  • Пул хранит только уникальные литералы и строки, к которым применен метод intern().
  • Это оптимизация для экономии памяти и повышения производительности.