Байты строки в java?

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

Ответ 1

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

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

// 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 "????")

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

Ответ 2

Если вы используете 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

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

Ответ 4

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

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", поскольку первая кодировка введет спецификацию, добавив 2 байта к длина массива.

Ответ 5

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

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

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

Ответ 6

Существует метод getBytes(). Используйте его с умом.

Ответ 7

Попробуйте следующее:

Bytes.toBytes(x).length

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