Как реализован Java String конструктор? - PullRequest
2 голосов
/ 16 марта 2020

Я просматривал Java Исходный код строки, нашел CTOR, где у меня есть некоторые сомнения:

public String(String original) {
    this.value = original.value;
    this.hash = original.hash;
}

Я понял, что Original действует как литерал String (с двойными кавычками), но не в состоянии понять, как java / jvm вычисляется original.value как char Array. Что такое «ценность» здесь ?? если значение равно char Array, то как вычисляется .value функция / поле ???

Ответы [ 3 ]

2 голосов
/ 16 марта 2020

Да, как уже упоминалось в комментариях, это очень просто. Поскольку вы смотрите на сам класс String - он имеет доступ к своим собственным полям. И именно здесь символы, из которых состоит данная строка, на самом деле хранятся в массиве char. Этот метод просто ссылается на поле по имени, очень базовое c взаимодействие.

1 голос
/ 16 марта 2020

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 копируется в пул констант, и исходный класс может больше не отображаться как импортированный из. Для сохранения строковой константы в другом классе может потребоваться выполнить чистую сборку вручную, так как может не существовать зависимости класса.

1 голос
/ 16 марта 2020

docs говорит

Инициализирует вновь созданный объект String так, чтобы он представлял ту же последовательность символов, что и аргумент; другими словами, вновь созданная строка является копией строки аргумента. Если не требуется явная копия оригинала, использование этого конструктора не требуется, поскольку строки являются неизменяемыми.

Технически новая строка получит value и hash из original.

enter image description here

, что означает, что это копия другой строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...