1) Строки - это объекты, которые обычно содержат массив char
и длину строк. Массив символов обычно реализуется как непрерывный массив из 16-разрядных слов, каждое из которых содержит символ Unicode в собственном порядке байтов.
2) Присвоение значения символа целому числу преобразует 16-битный код символа Unicode в его целочисленный эквивалент. Таким образом, 'c'
, то есть U + 0063, становится 0x0063
или 99.
3) Поскольку каждый String
является объектом, он содержит другую информацию, нежели члены его класса (например, слово дескриптора класса, слово блокировки / семафора и т. Д.).
ADENDUM
Содержимое объекта зависит от реализации JVM (которая определяет внутреннюю нагрузку, связанную с каждым объектом) и от того, как класс фактически закодирован (то есть некоторые библиотеки могут быть более эффективными, чем другие).
Пример
Типичная реализация выделяет служебную информацию из двух слов на экземпляр объекта (для дескриптора / указателя класса и управляющего слова семафора / блокировки); объект String
также содержит длину int
и ссылку на массив char[]
. Фактическое символьное содержимое строки хранится во втором объекте, массиве char[]
, которому, в свою очередь, выделяется два слова плюс слово длины массива плюс столько 16-битных элементов char
, сколько необходимо для строки ( плюс любые дополнительные символы, которые оставались бездействующими при создании строки).
ADDENDUM 2
Случай, когда one char представляет one Unicode-символ, верен только в большинстве случаев. Это подразумевало бы кодирование UCS-2 и значение true до 2005 года. Но к настоящему времени Unicode стал больше и строки должны кодироваться с использованием UTF-16 - где, увы, один символ Unicode может использовать two char
с в Java String
.
Взгляните на фактический исходный код для реализации Apache, например, в:
http://www.docjar.com/html/api/java/lang/String.java.html