Почему Java не реализовала это как 16-битные символы без знака?я имею в виду, что он будет в диапазоне 0,256, потому что только от 0 до 127 я могу держать значение Ascii, но что произойдет, если я установлю значение 200, расширенный ascii будет переполнен до -56.Примитивные типы данных Java были установлены в Java 1.0 четверть века назад.Компактные строки были введены в Java 9 менее двух лет назад.Эта новая функция, которая является просто подробностью реализации, не оправдывает фундаментальных изменений в системе типов Java.
Кроме того, вы смотрите на одну интерпретацию данных, хранящихся в байте.Ради представления единиц iso-latin-1 совершенно не имеет значения, приведет ли интерпретация тех же данных, что и встроенная в Java подписанная byte
, к положительному или отрицательному числу.
Аналогично вводу-выводу в JavaAPI позволяет считывать файл в массив byte[]
и записывать массивы byte[]
обратно в файлы, и этих двух операций уже достаточно для копирования файла без потерь, независимо от формата файла, который был бы важен при интерпретации его содержимого.
Итак, начиная с Java 1.1 работает следующее:
byte[] bytes = "È".getBytes("iso-8859-1");
System.out.println(bytes[0]);
System.out.println(bytes[0] & 0xff);
-56
200
Два числа, -56
и 200
, являются просто различными интерпретациями битовой комбинации 11001000
, тогда как iso-latin-1 интерпретация byte
, содержащая битовую комбинацию 11001000
, является символом È
.
Значение char
также является просто интерпретацией двухбайтовой величины, то есть как код UTF-16Блок.Аналогично, массив char[]
- это последовательность байтов в памяти компьютера со стандартной интерпретацией.
Мы также можем интерпретировать другие последовательности байтов следующим образом.
StringBuilder sb = new StringBuilder().appendCodePoint(128048);
byte[] array = new byte[4];
StandardCharsets.UTF_16LE.newEncoder()
.encode(CharBuffer.wrap(sb), ByteBuffer.wrap(array), true);
System.out.println(Arrays.toString(array));
напечатает значениевы видели, [61, -40, 48, -36]
.
Преимущество использования массива byte[]
внутри класса String
состоит в том, что теперь можно выбрать интерпретацию для использования iso-latin-1, когда всесимволы могут быть представлены с помощью этой кодировки или utf-16 в противном случае.
Возможные числовые интерпретации не имеют отношения к строке.Однако, когда вы спрашиваете: «Как Java может знать, что значение -56 равно 200», вы должны спросить себя, как он узнает, что битовая комбинация 11001000
для byte
в первую очередь -56
?
System.out.println(value[0]);
несет действительно дорогостоящую операцию, по сравнению с обычной компьютерной арифметикой, преобразование byte
(или int
) в String
.Эта операция преобразования часто упускается из виду, так как она была определена как способ печати byte
по умолчанию, но не более естественна, чем преобразование в String
, интерпретирующее значение как число без знака.Для дальнейшего чтения я рекомендую Дополнение к двум .