Ответ
Класс String в Java является неизменяемым (immutable) благодаря нескольким ключевым решениям в его дизайне:
finalкласс: Класс объявлен какfinal, что запрещает наследование и переопределение его методов.private finalполя: Внутренние поля (например,char[] value) объявлены какprivate final. Их значение можно задать только при создании объекта в конструкторе.- Отсутствие сеттеров: Нет публичных методов, изменяющих состояние объекта после его создания.
- Защитное копирование: Конструкторы, принимающие изменяемые данные (например, массив
char[]), создают внутреннюю копию этого массива. - Возврат новых объектов: Методы, которые кажутся изменяющими строку (например,
concat(),substring()), на самом деле возвращают новый объектString.
Пример и последствия:
String original = "Hello";
String modified = original.concat(" World"); // Создается новый объект
System.out.println(original); // "Hello" - исходный объект не изменился
System.out.println(modified); // "Hello World"
Преимущества неизменяемости строк:
- Потокобезопасность: Объекты можно безопасно использовать в многопоточных сценариях без синхронизации.
- Кэширование хэша: Хэш-код строки вычисляется один раз и кэшируется, что повышает производительность в коллекциях вроде
HashMap. - Безопасность: Исключается риск непреднамеренного изменения строк, переданных в качестве параметров (например, в
SecurityManager). - Возможность пулинга: Механизм String Pool позволяет экономить память, повторно используя литералы и строки, созданные методом
intern().