В java, если у меня есть String x, как я могу вычислить количество байтов в этой строке?
Байты строки в java?
Ответ 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
Это не учитывает ссылки на строковый объект.
Ответ 3
В соответствии с Как преобразовать строки в и из массивов байтов UTF8 в Java:
String s = "some text here";
byte[] b = s.getBytes("UTF-8");
System.out.println(b.length);
Ответ 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 до