Каковы ключевые особенности класса String в Java?

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

Ответ

String — это immutable (неизменяемый) класс, представляющий последовательность символов Unicode.

Основные особенности:

  • Неизменяемость: После создания строку нельзя изменить. Методы типа concat(), substring(), toUpperCase() возвращают новый объект String.
  • Пул строк (String Pool): Механизм для оптимизации памяти. Строковые литералы (например, "text") автоматически помещаются в пул. Метод intern() позволяет явно добавить строку в пул.
  • Сравнение:
    • == сравнивает ссылки на объекты.
    • equals() и equalsIgnoreCase() сравнивают содержимое строк.
  • Критически важные методы: length(), charAt(), indexOf(), substring(), split(), replace(), matches() (регулярные выражения).

Пример, демонстрирующий пул строк и неизменяемость:

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

System.out.println(s1 == s2); // true (одна ссылка)
System.out.println(s1 == s3); // false (разные объекты)
System.out.println(s1 == s4); // true (s4 вернула ссылку на объект из пула)

// Неизменяемость
String original = "Hello";
String modified = original.concat(" World"); // Создается НОВАЯ строка "Hello World"
System.out.println(original); // Остается "Hello"

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