在Java中,如果我有一个字符串x
,我该如何计算该字符串中的字节数?
答案 0 :(得分:258)
字符串是字符的列表(即代码点)。表示字符串所用的字节数完全取决于您使用哪种编码将其转换为字节。
也就是说,您可以将字符串转换为字节数组,然后按如下所示查看其大小:
// 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 "????")
(请注意,如果您不提供字符集参数,则使用平台的默认字符集。这在某些情况下可能很有用,但一般情况下应避免依赖默认值,并且在需要编码/解码时始终使用显式字符集。)
答案 1 :(得分:52)
如果您使用的是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
在具有压缩OOP(-XX:+ UseCompressedOops)的32位VM或64位VM上,引用为4个字节。所以总数将是:
sizeof(string) = 32 + string.length() * 2
这不考虑对字符串对象的引用。
答案 2 :(得分:18)
迂腐的答案(虽然不一定是最有用的答案,取决于你想对结果做什么)是:
string.length() * 2
Java字符串以UTF-16BE
编码物理存储,每个代码单元使用2个字节,String.length()
以UTF-16代码单位测量长度,因此这相当于:
final byte[] utf16Bytes= string.getBytes("UTF-16BE");
System.out.println(utf16Bytes.length);
这将告诉你内部char
数组的大小,在 bytes 中。
注意:"UTF-16"
将提供与"UTF-16BE"
不同的结果,因为前一个编码将插入BOM,在数组的长度上添加2个字节。
答案 3 :(得分:15)
根据How to convert Strings to and from UTF8 byte arrays in Java:
String s = "some text here";
byte[] b = s.getBytes("UTF-8");
System.out.println(b.length);
答案 4 :(得分:9)
String
实例在内存中分配一定量的字节。也许您正在查看类似sizeof("Hello World")
的内容,它会返回数据结构本身分配的字节数?
在Java中,通常不需要sizeof
函数,因为我们从不分配内存来存储数据结构。我们可以查看String.java
文件以进行粗略估计,我们会看到一些'int',一些引用和一个char[]
。 Java language specification定义了char
的范围是0到65535,因此两个字节足以将单个char保留在内存中。但是JVM不必在2个字节中存储一个char,它只需要保证char
的实现可以保存定义范围的值。
所以sizeof
在Java中确实没有任何意义。但是,假设我们有一个大的String并且一个char
分配两个字节,那么String
对象的内存占用量至少为2 * str.length()
个字节。
答案 5 :(得分:5)
有一种名为getBytes()的方法。明智地使用它。
答案 6 :(得分:3)
试试这个:
Bytes.toBytes(x).length
假设您在
之前声明并初始化了x答案 7 :(得分:2)
为避免尝试捕获,请使用:
String s = "some text here";
byte[] b = s.getBytes(StandardCharsets.UTF_8);
System.out.println(b.length);
答案 8 :(得分:0)
尝试使用apache commons:
String src = "Hello"; //This will work with any serialisable object
System.out.println(
"Object Size:" + SerializationUtils.serialize((Serializable) src).length)