我知道Java中的字符串内部表示是UTF-16。 Java字符串是如何表示的?
此外,我了解在UTF-16字符串中,每个“字符”都由一个或两个16位代码单元编码。
然而,当我调试以下Java代码时:
String hello = "Hello";
变量hello是一个由5个字节组成的数组,分别是0x48、0x101、0x108、0x108、0x111,这是ASCII码中表示“Hello”的方式。
这是怎么实现的呢?
我知道Java中的字符串内部表示是UTF-16。 Java字符串是如何表示的?
此外,我了解在UTF-16字符串中,每个“字符”都由一个或两个16位代码单元编码。
然而,当我调试以下Java代码时:
String hello = "Hello";
变量hello是一个由5个字节组成的数组,分别是0x48、0x101、0x108、0x108、0x111,这是ASCII码中表示“Hello”的方式。
这是怎么实现的呢?
class Hi {
public static void main(String args[]) {
String hello = "Hello";
try {
Thread.sleep(60_000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
我在Ubuntu上使用jps
获取pid
并将其传递给gcore
进行内存转储。
在Hexeditor中发现以下内容:48 65 6C 6C 6F
,因此它作为ASCII字符存储在内存中。
但是还有48 00 65 00 6C 00 6C
,这是String
的UTF-16
表示的一部分。
String
的内部表示没有明确规定,这是实现细节,因此您不能依赖它。很可能在JDK-9中将其更改为使用双重编码(对于可以用Latin-1编码的字符串使用Latin-1,对于其他字符串使用UTF-16)。有关详细信息,请参见JEP-254。此功能已经集成在OpenJDK主代码库中,因此如果您正在使用Java-9早期访问版本,则实际上将具有5个字节。
char
值的字节数。 - yole