Являются ли объекты Java String массивом символов?
Я новичок в java и пытаюсь понять основы и основы языка.
точно ли утверждать, что объекты Java string являются внутренне классом, определенным как неизменяемый массив символов?
Я спрашиваю Это, поскольку я немного смущен спецификацией по сравнению с массивами char и классом string...
10.9 массив символов не является Строка В языке программирования Java, в отличие от C, массив char не является строкой, и ни строка, ни массив символов не заканчиваются на 'u0000 ' (нуль характер.) Объект String является неизменяемым, то есть его содержание не меняется, в то время как массив char имеет изменяемые элементы. Метод toCharArray в строке класса возвращает массив символов, содержащий та же последовательность символов, что и строка. Класс StringBuffer реализует полезные методы на изменяемых массивах письмена.
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.