A char
представляет символ в Java (*) . Он имеет размер 2 байта (по крайней мере, это соответствует допустимому диапазону значений).
Это не обязательно означает, что каждое представление символа имеет длину 2 байта. Фактически, многие кодировки резервируют только 1 байт для каждого символа (или используют 1 байт для наиболее распространенных символов).
Когда вы вызываете конструктор String(byte[])
, вы просите Java преобразовать byte[]
в String
, используя кодировку платформы по умолчанию. Поскольку кодировкой по умолчанию для платформы обычно является 1-байтовая кодировка, такая как ISO-8859-1, или кодировка переменной длины, такая как UTF-8, она может легко преобразовать этот 1 байт в один символ.
Если вы запустите этот код на платформе, которая использует UTF-16 (или UTF-32 или UCS-2 или UCS-4 или ...) в качестве кодировки по умолчанию для платформы, то вы не получите действительный результат (вы вы получите String
, содержащий взамен символ замены Юникода).
Это одна из причин, по которой вы не должны зависеть от кодировки платформы по умолчанию: при преобразовании между byte[]
и char[]
/ String
или между InputStream
и Reader
или между OutputStream
и Writer
, вы должны всегда указать, какую кодировку вы хотите использовать. Если вы этого не сделаете, то ваш код будет зависеть от платформы.
(*) это не полностью true: char
представляет кодовую точку UTF-16. Либо одна , либо две UTF-16 кодовые точки представляют кодовую точку Unicode. Кодовая точка Unicode обычно представляет символ, но иногда несколько кодовых точек Unicode используются для создания одного символа. Но приведенное выше приближение достаточно близко, чтобы обсудить данную тему.