首页 > 其他分享 >JDK9中的String底层实现为什么用UTF-16而不用UTF-8呢?

JDK9中的String底层实现为什么用UTF-16而不用UTF-8呢?

时间:2024-01-02 10:34:23浏览次数:48  
标签:字符 编码 UTF 字节 16 char String

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

标签:字符,编码,UTF,字节,16,char,String
From: https://blog.51cto.com/u_15812995/9063896

相关文章

  • 使用 PostgreSQL 16.1 + Citus 12.1 作为多个微服务的分布式 Sharding 存储后端
    在本教程中,我们将使用PostgreSQL16.1+Citus12.1作为多个微服务的存储后端,演示此类集群的样例设置和基本操作。Citus12.1实验环境设置Docker快速启动Citus分布式集群docker-compose.ymlversion:"3"services:master:container_name:"${COMPOSE_PROJECT_NAME:......
  • MD5三种方式加密(16位大小、32位大小),Base64两种方式加解密
    MD5加密后的位数有两种:16位与32位。16位实际上是从32位字符串中取中间的第9位到第24位的部分,用Java语言来说,即:Stringmd5_16=md5_32.substring(8,24)Java实现md5加密有三种方式可供选择1.Spring自带DigestUtils(优点,方便,代码简洁,缺点只可进行MD5加密)spring自带jar包......
  • java基础知识点API之String详解--String基础看它就够了
    一:概述java中的String在java.lang包下,使用时可以直接使用不需要进行导包。字符串在日常使用中非常多,例如之前的变量定义。二:详细说明<1>JDK-帮助文档中对Strng类的介绍<2>字符串常量的创建,字符串常量在创建之后,它们的值不能被更改,但是可以被共享。publicstaticvoidmain(String[......
  • 前端学习笔记202310学习笔记第一百贰拾叁天-nodejs-登录鉴权-JWT鉴权之16
    ......
  • 前端学习笔记202311学习笔记第一百贰拾肆天-nodejs-登录鉴权-JWT鉴权之16
    ......
  • Apple Safari 16.5 发布- macOS 专属浏览器 (独立安装包下载)
    AppleSafari16.5-macOS专属浏览器(独立安装包下载)Safari浏览器16formacOSMontery,BigSur作者主页:sysin.org之前Safari浏览器伴随macOS更新一起发布,需要系统更新才能体验到新版,现在库克终于带来了独立安装包,无需更新系统也可感受最新的卓越Web体验。当今世界是......
  • 文心一言 VS 讯飞星火 VS chatgpt (169)-- 算法导论13.2 2题
    二、用go语言,证明:在任何一棵有n个结点的二叉搜索树中,恰有n-1种可能的旋转。文心一言:要证明在任何一棵有n个结点的二叉搜索树中,恰有n-1种可能的旋转,我们可以按照以下步骤逐步推导:二叉搜索树的性质:在二叉搜索树中,任意一个结点的左子树上的所有结点值都小于该结点值,而右子......
  • [CF1902E] Collapsing Strings
    题目链接考虑拆贡献。显然答案可以拆成对于所有\(s_i\)的每一个后缀的反串,作为前缀在所有串中的出现次数的加和。这个东西字典树维护一下就行了。不知道是谁考场上写哈希赛后被人对着模数卡掉了点击查看代码#include<bits/stdc++.h>#defineFL(i,a,b)for(inti=(a......
  • [ABC216G] 01Sequence
    题目链接很显然,按照右端点从小到大排序,对于每段区间尽量地贪心放在靠右的位置即可。中间用std::set维护当前还是\(0\)的位置,以及树状数组维护区间\(1\)的个数。点击查看代码#include<bits/stdc++.h>#defineFL(i,a,b)for(inti=(a);i<=(b);++i)#defineFR(......
  • 文心一言 VS 讯飞星火 VS chatgpt (168)-- 算法导论13.2 1题
    一、用go语言,写出RIGHT-ROTATE的伪代码。文心一言:在计算机科学中,右旋转(RIGHT-ROTATE)是一种常见的操作,通常用于数组或链表。以下是一个使用Go语言实现右旋转的伪代码:funcrightRotate(arr[]int,kint)[]int{n:=len(arr)k%=n//防止k大于n的情况rev......