Java 字符串内部表示

Java String internal representation

我了解 Java 的内部表示形式为 String 是 UTF-16。 What is java string representation?

此外,我知道在 UTF-16 字符串中,每个 'character' 都使用一个或两个 16 位代码单元进行编码。

然而,当我调试以下java代码时

String hello = "Hello";

变量hello是一个5字节的数组0x48,0x101,0x108,0x108,0x111 这是 "Hello" 的 ASCII。

怎么会这样?

我使用以下代码获取了迷你 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)

如果找到这个:48 65 6C 6C 6F 在使用 Hexeditor 的转储中,所以它在内存中的某个地方作为 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 个字节。