Ответ
Класс 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— для многопоточных сценариев (потокобезопасный, но медленнее).