Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java字符串内部表示_Java_String_Encoding_Utf 16 - Fatal编程技术网

Java字符串内部表示

Java字符串内部表示,java,string,encoding,utf-16,Java,String,Encoding,Utf 16,我知道Java for String的内部表示是UTF-16 另外,我知道在UTF-16字符串中,每个“字符”都用一个或两个16位代码单元编码 但是,当我调试以下java代码时 String hello = "Hello"; 变量hello是由5个字节组成的数组0x48、0x101、0x108、0x108、0x111 这是“你好”的ASCII码 这怎么可能呢?我用以下代码对一个小型java进程进行了gcore转储: class Hi { public static void main

我知道Java for String的内部表示是UTF-16

另外,我知道在UTF-16字符串中,每个“字符”都用一个或两个16位代码单元编码

但是,当我调试以下java代码时

String hello = "Hello";
变量hello是由5个字节组成的数组0x48、0x101、0x108、0x108、0x111 这是“你好”的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
内存转储。(使用gn
jps
获取
pid
并将其传递给gcore)

如果使用Hexeditor在转储中找到:
48 65 6C 6C 6F
,那么它在内存中的某个位置作为ASCII


但是也没有指定
48 00 65 00 00 6C 00 6C
,它是
UTF-16
字符串的
。在JDK-9中很可能会更改为使用双重编码(可以用拉丁语1编码的字符串使用拉丁语1,其他字符串使用UTF-16)。有关详细信息,请参阅。此功能已经集成到OpenJDK主代码库中,因此如果您使用Java-9早期访问版本,实际上将有5个字节。

如何调试此功能?这只是一个字符数组。你确定这不是你看到的变量名吗?@Fildor 0x48有“H”字符表示,而不是“H”。@Marounnaroun很好……你怎么知道的?IntelliJ IDEA调试器不显示用于存储
char
值的字节数。是的,它是在编译的.class文件的常量池中以ASCII(或者更确切地说是UTF8)表示的。好吧,这个答案,加上上面@yole的注释(IntelliJ调试器现在一定会显示每个char的大小)回答了这个问题。非常感谢。