JDK9 为何要将 String 的底层实现由 char[] 改成了 byte[] ?
参考链接:https://www.zhihu.com/question/447224628
String name = "jack";
这样的,使用 Latin-1 编码,占用 4 个字节就够了。
String name = "程序员老鬼";
这种,木的办法,只能使用 UTF16 来编码。
针对 JDK 9 的 String 源码里,为了区别编码方式,追加了一个 coder 字段来区分。
/**
* The identifier of the encoding used to encode the bytes in
* {@code value}. The supported values in this implementation are
*
* LATIN1
* UTF16
*
* @implNote This field is trusted by the VM, and is a subject to
* constant folding if String instance is constant. Overwriting this
* field after construction will cause problems.
*/
private final byte coder;
如果只有一个字节,那么最高的比特位为 0; 如果有多个字节,那么第一个字节从最高位开始,连续有几个比特位的值为 1,就使用几个字节编码,剩下的字节均以 10 开头。
那有小伙伴可能会问,UTF-16也是变长的呢?一个字符还可能占用 4 个字节呢?
评论