Являются ли строковые объекты Java массивом символов?

Я новичок в Java и пытаюсь понять основы и основы языка.

Правильно ли утверждать, что строковые объекты Java по сути являются классом, определенным как неизменный массив символов?

Я спрашиваю об этом, так как я немного смущен спецификацией по сравнению с массивами символов и классом string...

JLS 10,9

10.9 Массив символов не является строкой В языке программирования Java, в отличие от C, массив char не является String, и ни String, ни массив char не заканчиваются символом \u0000 (символ NUL). Объект String является неизменным, то есть его содержимое никогда не изменяется, в то время как массив char содержит изменяемые элементы. Метод toCharArray в классе String возвращает массив символов, содержащий ту же последовательность символов, что и String. Класс StringBuffer реализует полезные методы для изменяемых массивов символов.

JLS 4.3.3

4.3.3 Экземпляры класса String класса String представляют последовательности кодовых точек Unicode.

1 ответ

Решение

Правильно ли утверждать, что строковые объекты Java по сути являются классом, определенным как неизменный массив символов?

Нет. Объект Java String (в настоящее время - это детали реализации, которые, как я понимаю, могут быть изменены) - это класс, содержащий несколько полей:

  • char[] содержит действительные символы
  • Начальный индекс в массив
  • Длина
  • Кэшированный хэш-код, лениво вычисляемый

Причиной индекса и длины является то, что несколько строк могут содержать ссылки на один и тот же char[], Это используется некоторыми операциями, такими как substring (во многих реализациях, во всяком случае).

Важным является API для String хотя - который сильно отличается от API для массива. Это API, о котором вы могли бы подумать, принимая во внимание определение JLS: String представляет последовательность кодовых точек Unicode. Таким образом, вы можете взять подпоследовательность (Substring) найти данную подпоследовательность (indexOf), преобразуйте его в верхний регистр и т. д.

На самом деле JLS было бы немного точнее назвать его последовательностью кодовых блоков UTF-16; вполне возможно построить строку, которая не является допустимой последовательностью кодовых точек Unicode, например, включив одну половину "суррогатной пары" кодовых единиц UTF-16, но не другую. Есть части API, которые имеют дело с String с точки зрения единиц кода, но, честно говоря, большинство разработчиков проводят большую часть времени, рассматривая строки, как если бы не символы BMP не существовали.

Другие вопросы по тегам