在Java中,如果我有一个String x
,如何计算该字符串中的字节数?
在Java中,如果我有一个String x
,如何计算该字符串中的字节数?
Answers:
字符串是字符列表(即代码点)。表示字符串所用的字节数完全取决于您使用哪种编码将其转换为字节。
也就是说,您可以将字符串转换为字节数组,然后按如下所示查看其大小:
// 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 "????")
(请注意,如果不提供字符集参数,则会使用平台的默认字符集。这在某些情况下可能会很有用,但通常应避免依赖默认值,并且在编码/时始终使用显式字符集需要解码。)
getBytes()
它,将使用系统的默认字符编码。
如果使用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
这没有考虑到对字符串对象的引用。
sizeof
应为8的倍数
时髦的答案(尽管不一定是最有用的答案,具体取决于您要对结果执行的操作)是:
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个字节。
根据如何在Java中将字符串与UTF8字节数组之间来回转换:
String s = "some text here";
byte[] b = s.getBytes("UTF-8");
System.out.println(b.length);
s.getBytes(Charset.forName("UTF-8"))
。
甲String
的实例分配一定量的在存储器的字节。也许您正在寻找类似的东西sizeof("Hello World")
,它会返回数据结构本身分配的字节数?
在Java中,通常不需要sizeof
功能,因为我们从不分配内存来存储数据结构。我们可以看一下String.java
文件进行粗略估算,然后看到一些“ int”,一些引用和一个char[]
。在Java语言规范定义,一个char
范围为0〜65535,所以两个字节是足以保持一个单个字符在存储器中。但是,JVM不必在2个字节中存储一个字符,它仅需保证实现char
可以包含定义范围的值。
因此,sizeof
在Java中确实没有任何意义。但是,假设我们有一个很大的String并char
分配了两个字节,则String
对象的内存占用量至少2 * str.length()
为字节。
有一个名为getBytes()的方法。明智地使用它。