Java String内部表示

时间:2016-01-27 08:20:34

标签: java string encoding utf-16

据我所知,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。

这怎么可能?

2 个答案:

答案 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个字节。