JEP 400: UTF-8 by Default
JDK18 里有一项改进叫:JEP 400: UTF-8 by Default
其实是将默认字符集改为 UTF-8,只是 Charset.defaultCharset() 返回 UTF-8,在这之前的 JDK 版本中,返回的字符集根据操作系统的不同会不一样,有可能会导致乱码,可以看到这个方法的注释
1 | Returns the default charset of this Java virtual machine. |
之前的版本只有这一行
1 | Returns the default charset of this Java virtual machine. |
所以并不是改了 String 的实现
JEP 254: Compact Strings
Java 中的 String 默认采用 UTF-16 字符集,这其实是历史的包袱,为了要支持新版本的 Unicode,又要保证向后兼容,因为谁也想不到计算机的发展是如此迅猛,当时是足够用了
如今用了 UTF-16,可以存大部分辅助字符(Emoji 等)了,但是对于西方国家,日常的简单字母,有点浪费
因此 JDK9 进行了改动,将底层 char[] 改为 byte[],并且在原有基础上加入了 Latin-1(ISO-8859-1)字符集,详细可以看这个 JEP:JEP 254: Compact Strings
String(UTF-16 + Latin-1),其中内部多了个字段 coder
1 | private final byte coder; |
当无法用 Latin-1 表示的时候,才使用 UTF-16,减少了内存的浪费
所以 JEP 400 和 String 本身的实现关系不大