据我所知,Java for String的内部表示形式是UTF-16。 What is java string representation?
另外,我知道在UTF-16字符串中,每个'字符'都用一个或两个16位代码单元编码。
但是,当我调试以下java代码
时String hello = "Hello";
变量hello是一个5字节的数组0x48,0x101,0x108,0x108,0x111 这是“Hello”的ASCII。
这怎么可能?
答案 0 :(得分:3)
我使用以下代码进行了一个迷你java进程的gcore转储:
class Hi {
public static void main(String args[]) {
String hello = "Hello";
try {
Thread.sleep(60_000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
在Ubuntu上进行了gcore
内存转储。 (使用jps
获取pid
并将其传递给gcore)
如果在转储中使用Hexeditor找到了这个:48 65 6C 6C 6F
,那么它在内存中就像ASCII一样。
但48 00 65 00 6C 00 6C
也是UTF-16
的{{1}}表示的一部分
答案 1 :(得分:1)
String
内部表示未指定,它是实现细节,因此您不能依赖它。它很可能在JDK-9中将其更改为使用双重编码(Latin-1表示可以用Latin-1编码的字符串,UTF-16用于其他字符串)。有关详细信息,请参阅JEP-254。此功能已集成在OpenJDK主代码库中,因此如果您使用的是Java-9早期访问版本,则实际上将有5个字节。