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 个字节。
我了解 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 个字节。