回答
两个目的:节约内存和提升性能。
在 Java 9 之前,String
对象内部是通过一个 char
数组来存储字符的,每个 char
占用2个字节(使用的 UTF-16 编码)。这就导致一些 String 中的字符都是拉丁字母(例如英文、数字)也是占用 2 个字节,但实际上它们只需要一个字节就足够了,导致了内存的浪费。
在 Java 9 中,String
对象内部表示由一个 char
数组改变为使用 byte
数组,同时使用一个编码标记(coder
)用于指示String
是使用哪种编码格式存储的:Latin-1
或者UTF-16
:
- 如果
String
只包含拉丁字母,那么它会使用ISO-8859-1
编码,每个字符只占用一个字节 - 如果
String
还包含其他字符,那么它会使用UTF-16
编码,每个字符占用 2 个或更多字节。
这种改变使得 Java 9 能够在不牺牲兼容性的前提下,根据字符串的实际内容动态选择最节省空间的编码方式,从而减少内存消耗。
同时,由于 String
的存储结构与编码方式更加紧凑了,String
操作的性能也有所提高。
扩展
大明哥相信绝大数小伙伴一定看过 Java 8 的 String
源码,对于它的底层存储结构一定不陌生,在 Java 9 之前,String
的底层存储结构都是 char[]
: