Строка в Java представлена классом String. Он содержит массив типа char (char[] value) и целочисленное поле int hash, которое кэширует хеш-код строки.
Ключевые особенности:
String не может быть изменен. Любая операция, изменяющая строку (например, конкатенация), создает новый объект String. Это делает строки потокобезопасными и позволяет использовать их в качестве ключей в хеш-картах (HashMap)."hello"), JVM сначала проверяет, существует ли такая строка в пуле. Если да, возвращается ссылка на существующий объект. Если нет, создается новый объект и добавляется в пул. Для строк, созданных с помощью new String(...), новый объект всегда создается вне пула. Метод intern() можно использовать, чтобы добавить такую строку в пул или получить ссылку на соответствующую строку из пула.char. Начиная с Java 9, для экономии памяти для строк, состоящих только из однобайтовых символов (Latin-1), используется массив byte (byte[] value) и флаг кодировки (coder). Это называется Compact Strings. Для строк с символами, требующими два байта (например, Unicode), по-прежнему используется char[].Пример:
java
Представление в памяти (для Java 9+ с Compact Strings):
byte[] value будет содержать байты, соответствующие символам 'h', 'e', 'l', 'l', 'o'.int coder будет указывать на кодировку (например, LATIN1).char[] value будет содержать символы 'п', 'р', 'и', 'в', 'е', 'т'.int coder будет указывать на кодировку (например, UTF16).Неизменяемость и пул строк являются ключевыми аспектами, влияющими на производительность и использование памяти при работе со строками в Java.