Java字符串内部表示
我知道Java for String的内部表示是UTF-16 另外,我知道在UTF-16字符串中,每个“字符”都用一个或两个16位代码单元编码 但是,当我调试以下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
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
内存转储。(使用gnjps
获取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的大小)回答了这个问题。非常感谢。