在java中的string的字节?
在Java中,如果我有一个stringx我如何计算string中的字节数?
一个string是一个字符列表(即代码点)。 用来表示string的字节数完全取决于您使用哪种编码将其转换为字节 。
也就是说,你可以把string转换成一个字节数组,然后查看它的大小,如下所示:
// 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”string在其表示中可以有不同数量的字节,取决于使用哪种编码。 作为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 "????")
(请注意,如果您没有提供字符集参数,则会使用平台的默认字符集,这在某些情况下可能会有用,但一般情况下您应避免使用默认字符集,并且在编码/解码是必需的。)
如果您正在运行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
这不考虑对string对象的引用。
根据如何将string转换为Java中的UTF8字节数组,
String s = "some text here"; byte[] b = s.getBytes("UTF-8"); System.out.println(b.length);
迂腐的答案(虽然不一定是最有用的答案,取决于你想要做的结果)是:
string.length() * 2
Javastring以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个字节添加到数组的长度。
一个String
实例在内存中分配一定数量的字节。 也许你正在看像sizeof("Hello World")
这将返回数据结构本身分配的字节数?
在Java中,通常不需要sizeof
函数,因为我们从不分配内存来存储数据结构。 我们可以看一下String.java
文件的粗略估计,我们看到一些'int',一些引用和一个char[]
。 Java语言规范定义了一个char
范围从0到65535,所以两个字节足以在内存中保留一个字符。 但是JVM并不需要在2个字节中存储一个字符,它只需要保证char
的实现可以保存定义范围的值。
所以sizeof
在Java中确实没有任何意义。 但是,假设我们有一个大的string和一个char
分配两个字节,那么一个String
对象的内存占用至less2 * str.length()
以字节为单位。
有一个叫getBytes()的方法。 明智地使用它。
尝试这个 :
Bytes.toBytes(x).length
假设你在之前声明并初始化了x