Байты строки в Java - PullRequest
       43

Байты строки в Java

149 голосов
/ 08 декабря 2010

В Java, если у меня есть строка x, как я могу вычислить количество байтов в этой строке?

Ответы [ 7 ]

260 голосов
/ 08 декабря 2010

Строка представляет собой список из символов (т. Е. Кодовые точки).Количество байтов, взятых для представления строки , полностью зависит от того, какую кодировку вы используете, чтобы превратить ее в байты .

При этом вы можете превратить строку в байтовый массив и затем посмотреть наего размер выглядит следующим образом:

// The input string for this test
final String string = "Hello World";

// Check length, in characters
System.out.println(string.length()); // prints "11"

// Check encoded sizes
final byte[] utf8Bytes = string.getBytes("UTF-8");
System.out.println(utf8Bytes.length); // prints "11"

final byte[] utf16Bytes= string.getBytes("UTF-16");
System.out.println(utf16Bytes.length); // prints "24"

final byte[] utf32Bytes = string.getBytes("UTF-32");
System.out.println(utf32Bytes.length); // prints "44"

final byte[] isoBytes = string.getBytes("ISO-8859-1");
System.out.println(isoBytes.length); // prints "11"

final byte[] winBytes = string.getBytes("CP1252");
System.out.println(winBytes.length); // prints "11"

Итак, вы видите, что даже простая строка "ASCII" может иметь различное количество байтов в своем представлении, в зависимости от используемой кодировки.В качестве аргумента для getBytes() используйте любой набор символов, который вас интересует.И не попадайтесь в ловушку, предполагая, что UTF-8 представляет каждый символ в виде одного байта, поскольку это также неверно:

final String interesting = "\uF93D\uF936\uF949\uF942"; // Chinese ideograms

// Check length, in characters
System.out.println(interesting.length()); // prints "4"

// Check encoded sizes
final byte[] utf8Bytes = interesting.getBytes("UTF-8");
System.out.println(utf8Bytes.length); // prints "12"

final byte[] utf16Bytes= interesting.getBytes("UTF-16");
System.out.println(utf16Bytes.length); // prints "10"

final byte[] utf32Bytes = interesting.getBytes("UTF-32");
System.out.println(utf32Bytes.length); // prints "16"

final byte[] isoBytes = interesting.getBytes("ISO-8859-1");
System.out.println(isoBytes.length); // prints "4" (probably encoded "????")

final byte[] winBytes = interesting.getBytes("CP1252");
System.out.println(winBytes.length); // prints "4" (probably encoded "????")

(Обратите внимание, что если вы неДля предоставления аргумента набора символов используется набор символов платформы по умолчанию . Это может быть полезно в некоторых контекстах, но в целом следует избегать зависимости от значений по умолчанию и всегда использовать явный набор символов при кодировании / декодированиитребуется.)

52 голосов
/ 03 августа 2013

Если вы работаете с 64-битными ссылками:

sizeof(string) = 
8 + // object header used by the VM
8 + // 64-bit reference to char array (value)
8 + string.length() * 2 + // character array itself (object header + 16-bit chars)
4 + // offset integer
4 + // count integer
4 + // cached hash code

Другими словами:

sizeof(string) = 36 + string.length() * 2

На 32-битной или 64-битной виртуальной машине со сжатымООП (-XX: + UseCompressedOops), ссылки 4 байта.Таким образом, общая сумма будет:

sizeof(string) = 32 + string.length() * 2

Это не учитывает ссылки на строковый объект.

18 голосов
/ 08 декабря 2010

Педантичный ответ (хотя не обязательно самый полезный, в зависимости от того, что вы хотите сделать с результатом):

string.length() * 2

Java-строки физически хранятся в кодировке UTF-16BE, которая использует2 байта на кодовую единицу, а String.length() измеряет длину в кодовых единицах UTF-16, так что это эквивалентно:

final byte[] utf16Bytes= string.getBytes("UTF-16BE");
System.out.println(utf16Bytes.length);

И это скажет вам размер внутреннего массива charбайтах .

Примечание: "UTF-16" даст результат, отличный от "UTF-16BE", так как прежняя кодировка вставит BOM , добавив 2 байта к длинемассива.

15 голосов
/ 08 декабря 2010

Согласно Как преобразовать строки в байтовые массивы UTF8 и из них в Java :

String s = "some text here";
byte[] b = s.getBytes("UTF-8");
System.out.println(b.length);
9 голосов
/ 08 декабря 2010

Экземпляр String выделяет определенное количество байтов в памяти.Может быть, вы смотрите на что-то вроде sizeof("Hello World"), которое возвращает количество байтов, выделенных самой структурой данных?

В Java обычно нет необходимости в функции sizeof, потому что мы никогда не выделяем память дляхранить структуру данных.Мы можем взглянуть на файл String.java для приблизительной оценки, и мы увидим некоторые 'int', некоторые ссылки и char[]. Спецификация языка Java определяет, что char находится в диапазоне от 0 до 65535, поэтому двух байтов достаточно для сохранения одного символа в памяти.Но JVM не должна хранить один символ в 2 байта, она только должна гарантировать, что реализация char может содержать значения диапазона определения.

Так что sizeof действительно не создает никакихсмысл в Java.Но если предположить, что у нас есть большая строка и один char выделяет два байта, то объем памяти для объекта String составляет по крайней мере 2 * str.length() в байтах.

5 голосов
/ 08 декабря 2010

Есть метод с именем getBytes () .Используйте это с умом.

3 голосов
/ 08 декабря 2010

Попробуйте:

Bytes.toBytes(x).length

Предполагая, что вы объявили и инициализировали x до

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...