什么是Java的String内部代表?修改过的UTF-8?UTF-16?我在Java的内部表示中搜索了String,但我有两种看起来可靠但不一致的材料。一个是:http://www.codeguru.com/cpp/misc/misc/multi-lingualsupport/article.php/c10451它说:Java使用UTF-16作为内部文本表示,并支持对字符串序列化进行非标准的UTF-8修改。另一个是:http://en.wikipedia.org/wiki/UTF-8#Modified_UTF-8它说:Tcl也使用与Java相同的修改后的UTF-8 [25]来表示Unicode数据,但对外部数据使用严格的CESU-8。修改过的UTF-8?还是UTF-16?哪一个是正确的?Java在内存中使用了多少字节?请让我知道哪一个是正确的以及它使用了多少字节。
3 回答
波斯汪
TA贡献1811条经验 获得超4个赞
在Java 9之前,Java的标准内存表示String
是在a中保存的UTF-16代码单元char[]
。修改后的UTF-8用于其他环境; 例如,在“.class”文件中,以及对象序列化格式。
您可以通过查看java.lang.String
类的源代码来确认这一点。
在Java 6更新21及更高版本中,有一个非标准选项(-XX:UseCompressedStrings
)来启用压缩字符串。Java 7中删除了此功能。
对于Java 9及更高版本,默认情况下,行为if String
已更改为使用Strings的紧凑表示形式。该命令的文档现在这样说:java
-XX:-CompactStrings
禁用紧凑字符串功能。默认情况下,启用此选项。启用此选项后,将仅使用ISO-8859-1 / Latin-1编码在内部表示包含单字节字符的Java字符串,并将其存储为单字节每字符字符串。这减少了50%,仅包含单字节字符的字符串所需的空间量。对于包含至少一个多字节字符的Java字符串:这些字符使用UTF-16编码表示并存储为每个字符2个字节。禁用Compact Strings功能会强制使用UTF-16编码作为所有Java字符串的内部表示。
请注意,“压缩”或“紧凑”字符串均未使用/使用UTF-8编码。
添加回答
举报
0/150
提交
取消