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

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

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

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

JLS 10.9

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

JLS 4.3.3

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

1 ответов


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

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

  • A char[] содержащий фактические символы
  • начальный индекс в массиве
  • длиной
  • кэшированное хэш-код, лениво вычисленный

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

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

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