2024-03-14
版权声明:本文为博主付费文章,严禁任何形式的转载和摘抄,维权必究。 本文链接:https://www.skjava.com/mianshi/baodian/detail/9949618445

回答

两个目的:节约内存提升性能

在 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[]