String by design содержит текст Unicode, поэтому все языковые сценарии могут быть объединены. Для этого реализация содержит массив (имя поля value
), где каждый символ представляет собой двухбайтовое значение UTF-16.
Вы встретили единичную и AFAIK единственную глупую точку в классах Java.
Показанный конструктор копирования не имеет смысла, так как строки являются неизменяемыми объектами и могут быть разделены простым присваиванием. Это ископаемое наследование C ++, возможно, связанное с интернированием String.
Делать копию бессмысленно. Это относится и к внутреннему массиву char
, который действительно может быть назначен по ссылке. (Не очень последовательно.)
Таким образом, следующее показывает неопытное использование java:
String s = new String(t);
В новейших java версиях значение String может фактически быть байтовым массивом. в некоторой кодировке, и, следовательно, символы предоставляются лениво.
О строковых литералах:
Строковые литералы хранятся в структуре данных в файле .class с именем константный пул . Хранится это как UTF-8 байтов. JVM ClassLoader гарантирует, что строка загружается как String.
Импорт констант final static String
копируется в пул констант, и исходный класс может больше не отображаться как импортированный из. Для сохранения строковой константы в другом классе может потребоваться выполнить чистую сборку вручную, так как может не существовать зависимости класса.