Как Java инициализирует строковый литерал - PullRequest
0 голосов
/ 12 мая 2018

Javadoc сказал, что:

Класс String представляет строки символов.Все строковые литералы в программах Java, такие как «abc», реализованы как экземпляры этого класса.

Мы знаем, что класс String имеет два свойства, а именно: value[] и hash,и строковый литерал хранятся в пуле строк.

Но я не могу выяснить , как этот строковый литерал инициализируется , прежде чем помещать в этот пул.Как будто я отлаживаю строковый литерал позже, я вижу, что value[] и hash каким-то образом заполнены.

Вызывает ли JVM специальную инструкцию?

Ответы [ 3 ]

0 голосов
/ 12 мая 2018

Следуйте за точкой останова на public String(char value[]) из String класса.

Редактировать : Кто бы ни проголосовал за это:

Во-первых, вы пробовали согласно ответу? Я пытался, и это останавливается именно таким способом. Я пробовал с двумя разными IDE. Во-вторых, value член (как указано в OP) назначается в этом методе. Если бы вы действительно пытались, вы бы получили это. В-третьих, члену hash (как указано в OP) присваивается значение при вызове hashCode(), а члену hash присваивается значение в нем.

Очевидно, вы не пробовали. Если бы вы это сделали, расследование точки останова привело бы вас к ответам в OP:

1) как инициализируется этот строковый литерал

и

2) ... как-то населен

.

0 голосов
/ 12 мая 2018

JVM создает новый строковый литерал объект во время постоянное разрешение пула , если эта же строка не была ранее помещена в таблицу строк при вызове String.intern.

Не указанокак JVM создает и инициализирует такие строки, поэтому JVM может делать все, что захочет, при условии, что результирующий объект является обычным java.lang.String экземпляром, к которому можно получить доступ из кода приложения.

Что касается HotSpot JVM, то это не так.вызовите любой из String конструкторов, он просто выделяет новый объект в Heap и заполняет поля в коде C ++, см. java_lang_String::basic_create:

Handle java_lang_String::basic_create(int length, TRAPS) {
  assert(initialized, "Must be initialized");
  // Create the String object first, so there's a chance that the String
  // and the char array it points to end up in the same cache line.
  oop obj;
  obj = InstanceKlass::cast(SystemDictionary::String_klass())->allocate_instance(CHECK_NH);

  // Create the char array.  The String object must be handlized here
  // because GC can happen as a result of the allocation attempt.
  Handle h_obj(THREAD, obj);
  typeArrayOop buffer;
    buffer = oopFactory::new_charArray(length, CHECK_NH);

  // Point the String at the char array
  obj = h_obj();
  set_value(obj, buffer);
  // No need to zero the offset, allocation zero'ed the entire String object
  assert(offset(obj) == 0, "initial String offset should be zero");
//set_offset(obj, 0);
  set_count(obj, length);

  return h_obj;
}

hash полетакой новый объект инициализируется нулем.Правильный хеш-код будет рассчитан при первом вызове String.hashCode.

0 голосов
/ 12 мая 2018

Вызывает ли JVM специальную инструкцию?

Нет.Для этого не существует «специальной» инструкции JVM.

Скорее всего, инфраструктура загрузки классов будет создавать объекты String, соответствующие литералам, используя один из конструкторов String;например, String(char[]) или String(byte[]).Он будет получать символы или байты из области «постоянного пула» в файле «.class».

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