x
,如何计算该字符串中的字节数?x
,如何计算该字符串中的字节数?字符串是字符(即代码点)的列表。将其转换为字节所占用的字节数完全取决于使用的编码方式。
尽管如此,您可以将字符串转换为字节数组,然后按以下方式查看其大小:
// 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 "????")
(注意,如果您没有提供字符集参数,则使用平台的默认字符集。这在某些情况下可能很有用,但通常应避免依赖默认值,并且在需要进行编码/解码时始终使用显式字符集。)
char
不是 一个码点。一个char
是16位(基本上是无符号的short
),因此它在内存中始终占用2个字节。需要使用int
来表示4字节的码点,这就是为什么像String.codePointAt()这样的方法返回int
而不是char
的原因。 - Andrzej Doyle如果你正在使用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位虚拟机或启用压缩的OOPs(-XX:+UseCompressedOops)的64位虚拟机上,引用占用4个字节。因此,总数为:
sizeof(string) = 32 + string.length() * 2
这并未考虑对字符串对象的引用。
sizeof
应该是 8 的倍数。 - dieter这里有一个学究式的答案(虽然并不一定是最有用的,取决于你对结果想要做什么):
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个字节。
String s = "some text here";
byte[] b = s.getBytes("UTF-8");
System.out.println(b.length);
s.getBytes(Charset.forName("UTF-8"))
。此代码行的作用是将字符串编码为UTF-8格式的字节数组。 - james.garrissString
实例在内存中分配一定数量的字节。也许你在查看像sizeof("Hello World")
这样的东西,它将返回数据结构本身分配的字节数?
在Java中,通常不需要sizeof
函数,因为我们从不分配内存来存储数据结构。我们可以查看String.java
文件进行粗略估计,我们看到一些'int'、一些引用和一个char[]
。 Java语言规范定义了char
的范围为0到65535,因此两个字节足以在内存中保存一个字符。但是JVM不必将一个字符存储在2个字节中,它只需要保证char
的实现可以容纳定义范围内的值。
因此,在Java中,sizeof
确实没有任何意义。但是,假设我们有一个大型字符串,一个char
分配两个字节,则String
对象的内存占用至少为2 * str.length()
字节。
有一种方法叫做getBytes()。明智使用它。
试试看:
Bytes.toBytes(x).length
Bytes
类。 - Kröw使用apache commons来尝试此操作:
String src = "Hello"; //This will work with any serialisable object
System.out.println(
"Object Size:" + SerializationUtils.serialize((Serializable) src).length)
String s = "some text here";
byte[] b = s.getBytes(StandardCharsets.UTF_8);
System.out.println(b.length);
Charset
,而不是使用字符串字面量 "UTF-8"
,那么您可以使用 java.nio
。import java.nio.charset.StandardCharsets;
..
int numBytes = myString.getBytes(StandardCharsets.UTF_8).length;