Как устроен класс String в Java?

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

Ответ

Класс String в Java представляет собой неизменяемую (immutable) последовательность символов в кодировке UTF-16.

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

  • Неизменяемость: Любая операция, модифицирующая строку (например, concat(), substring()), возвращает новый объект String. Исходный объект не изменяется.
  • Пул строк (String Pool): Строковые литералы и строки, созданные с помощью intern(), хранятся в специальной области памяти (heap). Это позволяет повторно использовать объекты и экономить память.
    • "abc" == "abc"true (один объект в пуле).
    • new String("abc") == "abc"false (разные объекты).
  • Внутреннее представление: До Java 9 использовался массив char[]. Начиная с Java 9, для оптимизации памяти используется массив byte[] с флагом кодировки (Latin-1 или UTF-16).
  • Сравнение: Для сравнения содержимого всегда используйте метод equals(), а не оператор ==.

Пример:

String s1 = "hello"; // Создается или берется из пула строк
String s2 = new String("hello"); // Создается новый объект в куче
String s3 = s1.concat(" world"); // Создается новый объект "hello world"

System.out.println(s1 == s2); // false (разные объекты)
System.out.println(s1.equals(s2)); // true (одинаковое содержимое)
System.out.println(s1); // "hello" (исходная строка не изменилась)

Для работы с изменяемыми последовательно символов используйте:

  • StringBuilder — для однопоточных сценариев (высокая производительность).
  • StringBuffer — для многопоточных сценариев (потокобезопасный, но медленнее).