Java字符串的内部表示

3

我知道Java中的字符串内部表示是UTF-16。 Java字符串是如何表示的?

此外,我了解在UTF-16字符串中,每个“字符”都由一个或两个16位代码单元编码。

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

String hello = "Hello";

变量hello是一个由5个字节组成的数组,分别是0x48、0x101、0x108、0x108、0x111,这是ASCII码中表示“Hello”的方式。

这是怎么实现的呢?


3
你是如何调试这个问题的?它只是一个字符数组。 - Ferrybig
1
你确定你看到的不是变量名吗? - Fildor
@MarounMaroun 好观点... - Fildor
这是我Intellij调试器的截图。是的,Ferrybig - 这是一个字符数组。 - Yoaz Menda
2
你怎么知道的?IntelliJ IDEA调试器不会显示用于存储char值的字节数。 - yole
显示剩余3条评论
2个回答

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上使用jps获取pid并将其传递给gcore进行内存转储。

在Hexeditor中发现以下内容:48 65 6C 6C 6F,因此它作为ASCII字符存储在内存中。

但是还有48 00 65 00 6C 00 6C,这是StringUTF-16表示的一部分。


1
是的,在编译后的.class文件的常量池中,它是以ASCII(或者更确切地说是UTF8)的形式存在的。 - yole
好的,这个答案与@yole上面的评论结合起来(Intellij调试器现在不一定显示每个字符的大小)回答了这个问题。谢谢! - Yoaz Menda

2

String的内部表示没有明确规定,这是实现细节,因此您不能依赖它。很可能在JDK-9中将其更改为使用双重编码(对于可以用Latin-1编码的字符串使用Latin-1,对于其他字符串使用UTF-16)。有关详细信息,请参见JEP-254。此功能已经集成在OpenJDK主代码库中,因此如果您正在使用Java-9早期访问版本,则实际上将具有5个字节。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接