JDK9中的String底层实现为什么用UTF-16而不用UTF-8呢?
  TEZNKK3IfmPf 2024年03月29日 42 0

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里可以当做一个定长的编码。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2024年03月29日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   2024年03月29日   14   0   0 javajdk
  TEZNKK3IfmPf   2023年11月14日   37   0   0 jvmjdk
  TEZNKK3IfmPf   2023年11月14日   18   0   0 C++字符
  TEZNKK3IfmPf   2023年11月15日   50   0   0 jdk
  TEZNKK3IfmPf   2024年03月29日   31   0   0 leetcode字符
  TEZNKK3IfmPf   2024年03月22日   29   0   0 java字符
TEZNKK3IfmPf