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