Как мой заголовок предлагает, это теоретический вопрос. Я хотел бы знать, что если java определяет строку с нулевым завершением.
Определяет ли java строку с нулевым завершением?
Ответ 1
Я хотел бы знать, что если java определяет строку как завершающую нуль.
Нет. Строка определяется как последовательность фиксированной длины значений char
. Все возможные значения char
(от 0 до 65535) могут использоваться в String. Нет "выделенного" значения, которое означает, что строка заканчивается.
Итак, как они отслеживают завершение строки? Использование длины?
Да. Объект String
имеет частное поле length
(во всех реализациях, которые я изучил...).
Если вы хотите больше узнать о том, как реализованы строки Java, исходный код для различных версий доступен в Интернете. Google для "источника java.lang.String".
Ответ 2
Строки Java не заканчиваются нулевыми символами, как на C или С++. Хотя java-строки используют внутренне массив char, но в этом нет никакого оконечного нуля. Класс String предоставляет метод, называемый длиной, чтобы узнать количество символов в строке.
Вот простой код и его содержимое отладчика:
public static void main(String[] args) {
String s = "Juned";
System.out.println(s);
}
Снимок экрана отладчика:
Ответ 3
Это имеет значение?
Если вы преобразуете строку Java в какой-то сериализованный формат (на диск, в сеть и т.д.), тогда все, что имеет значение, это формат сериализации, а не внутренний формат JVM.
Если вы читаете строковые данные в C-коде через JNI, вы никогда не читаете данные напрямую, вы всегда используете JNI-функции, такие как GetStringChars()
или GetStringUTFChars()
. GetStringChars()
не документируется как возвращающий данные с нулевым завершением, поэтому вы не должны предполагать, что оно завершено с нулевой отметкой - вы должны использовать GetStringLength()
для определения его длины. Аналогично GetStringUTFChars()
, вы должны использовать GetStringUTF8Length()
, чтобы определить его длину в измененном формате UTF-8.