关于JDK18的UTF-8

JEP 400: UTF-8 by Default

JDK18 里有一项改进叫:JEP 400: UTF-8 by Default

其实是将默认字符集改为 UTF-8,只是 Charset.defaultCharset() 返回 UTF-8,在这之前的 JDK 版本中,返回的字符集根据操作系统的不同会不一样,有可能会导致乱码,可以看到这个方法的注释

1
2
3
Returns the default charset of this Java virtual machine.

The default charset is UTF-8, unless changed in an implementation specific manner.

之前的版本只有这一行

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 本身的实现关系不大