JDK9的String类内部实现变更了!

JDK9的String类内部实现变更了!
上图是JDK8中的String类代码,内部实现是char的数组,构造函数用char数组来实例化的时候,只是做一下copy。
再来看下JDK9中的代码: 

JDK9的String类内部实现变更了!
不再是char的数组了,改为byte数组 + coder。
我们都知道java中char是16位UTF16编码的,那么马上就会有个问题,byte数组是如何存下char数组的?

JDK9的String类内部实现变更了!

JDK9的String类内部实现变更了!
这里是通过 StringUTF16.compress(value, off, len); 来判断,如果char数组存在 value > 0xFF 的值时,就返回null,见下图:
JDK9的String类内部实现变更了!
如果char数组所有的字符都是小于0xFF,那么正好让一个byte对应一个char,String构造到此结束。

只要存在一个char > 0xFF,那么将会把byte数组的长度改为两倍char数组的长度,用两个字节存放一个char ,见下图:

JDK9的String类内部实现变更了!

由于实现机制的变动,所有的String方法都重新实现了一遍,但对外的接口还是保持一致的。重构带来的最大好处就是在字符串中所有的字符都小于0xFF的情况下,会节省一半的内存。

老外估计早就想改了,老子可能一辈子做的东西都用不到0xFF之上的字符,却要占我一倍的内存!!哈哈~~