Является ли класс String в Java неизменяемым (immutable)?

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

Ответ

Да, String в Java — строго неизменяемый (immutable) класс. После создания объекта String его последовательность символов изменить невозможно.

Доказательство на примере:

String original = "Hello";
String modified = original.concat(" World"); // Создается НОВЫЙ объект

System.out.println(original); // "Hello" - исходный объект не изменился
System.out.println(modified); // "Hello World"

// Даже "изменяющие" методы возвращают новый объект
String upper = original.toUpperCase(); // Новый объект "HELLO"

Причины и преимущества неизменяемости String:

  1. Безопасность в многопоточности: Объекты String можно свободно передавать между потоками без синхронизации.
  2. Кэширование в String Pool: JVM хранит литералы и интернированные строки в пуле, что экономит память.
  3. Безопасность: Критические данные (например, пароли в char[]) не могут быть изменены через побочные ссылки.
  4. Корректность хеширования: Хеш-код строки, вычисленный один раз (т.к. поля неизменны), можно кэшировать и безопасно использовать в HashMap/HashSet.

Для изменяемых строк используйте StringBuilder или StringBuffer.