UTF-8
是一种对空间利用效率最高的编码集,它是不定长的,使用1~4字节为每个字符编码。
这种情况下,如果能用一个字节存放字符就不会使用两个字节,两个字节不够就用三个字节。这种编码集只适用于传输和存储,并不适合拿来做String的底层实现。
String有随机访问的方法,比如charAt、subString
等方法,利用数组随机访问性质,可以快速查询指定位置上的字符是什么。如果字符串中的每个字符占用的内存是不定长的,那么进行随机访问的时候,就需要从头开始数每个字符的长度,才能找到你想要的字符,这就好像数组的查询变成了链表的查询。
虽然UTF-16
也是变长的,使用2个或4个字节为每个字符编码。但是在 Java 编码中,一个 char 字符占2个字节,所有占4个字节的字符,在Java里是用两个char来存储的,而且 String 的各种操作,都是以 Java 的 char 字符为单位的。
比如:length
函数返回的是 char 字符的个数,charAt
是获取字符串中第几个 char 字符的值。 所以UTF-16
在 Java里可以当做一个定长的编码。