为什么 JDK9 把 String 中 char 数组改成了 byte 数组?

此答案节选自我们最近弄的 面试鸭小程序,更多大厂常问面试题,可以点击下面的小程序进行阅读哈!


这个题目的答案其实非常简单:这个操作主要是为了节省内存空间,提高内存利用率

在 JDK 9 之前,String 类是基于 char[] 实现的,内部采用 UTF-16 编码,每个字符占用两个字节。

但是,如果当前的字符仅需一个字节的空间,这就造成了浪费。例如一些 Latin-1 字符用一个字节即可表示。

因此 JDK 9 做了优化采用 byte 数组来实现:

并引入了 coder 变量来标识编码方式(Latin-1 或 UTF-16)。对于大多数只包含 Latin-1 字符(即每个字符可以用一个字节表示)的字符串,内存使用量减半。

扩展 Latin1

Latin1 是国际标准编码 ISO-8859-1 的别名。Latin1 也是单字节编码,在 ASCII 编码的基础上,利用了 ASCII 未利用的最高位,扩充了 128 个字符,因此 Latin1 可以表示 256 个字符,并向下兼容 ASCII。

Latin1收录的字符除 ASCII 收录的字符外,还包括西欧语言、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号。欧元符号出现的比较晚,没有被收录在 ISO-8859-1 当中,在后来的修订版 ISO-8859-15 加入了欧元符号。

Latin1的编码范围是 0x00-0xFF,ASCII的编码范围是 0x00-0x7F。

Latin1 相对 ASCII 而言,较少被提及,其实 Latin1 的使用还是比较广泛的,比如 MySQL(8.0之前)的数据表存储默认编码就是 Latin1。


最后再推荐下鸭鸭目前努力在做 面试小程序神器,已经有 3000 多道面试题目啦,欢迎大家来阅读!如果大家有不会的面试题,也可以在小程序内反馈!鸭鸭会第一时间为大家解答!

除了小程序版本,我们 web 端也上线啦:www.mianshiya.com


我是鸭鸭,我们下期见~

相关推荐

  • 全球电脑蓝屏崩溃,为何中国没事?周鸿祎:因 90% 用 360 软件!
  • 天津大学等提出首个「缸中大脑」控制机器人!脑机接口技术取得新突破
  • 长上下文能力只是吹牛?最强GPT-4o正确率仅55.8%,开源模型不如瞎蒙
  • 马斯克19天建成世界最强AI集群!10万块H100「液冷怪兽」即将觉醒
  • 谷歌AI天气「神算」登Nature:30秒模拟22天天气,效率暴涨10万倍!
  • Llama 3.1磁力链提前泄露!开源模型王座一夜易主,GPT-4o被超越
  • 5 个 Pandas 超级好用的隐藏技巧
  • 7k star!斯坦福开源学术研究神器!storm
  • 人民大学通报:教师王贵元猥亵女生情况属实,开除党籍、撤销教授职称开除!人大大王贵元教授性骚扰且强制猥亵我,并要求与我发生性关系”
  • 京东健康·全球医疗AI创新大赛火热进行中,立即参与,共创医疗新纪元!
  • 开源仅 1 天就斩获近万星!超越 RAG、让大模型拥有超强记忆力的 Mem0 火了!
  • 史上最全 Git 图文教程,没有之一
  • 粗看最近爆火的mem0个性化轻量级框架:兼谈多模态数据的tokenizer
  • 下半年面试难度太大了...
  • 是时候丢掉 BeanUtils 了!
  • ECCV 2024|盲视频去闪烁通用方法BlazeBVD来了,美图&国科大联合提出
  • 无限生成视频,还能规划决策,扩散强制整合下一token预测与全序列扩散
  • 真相了!大模型解数学题和人类真不一样:死记硬背、知识欠缺明显,GPT-4o表现最佳
  • 神经网络也有空间意识!学会在Minecraft创建地图,登上Nature子刊
  • 首个超越GPT4o级开源模型!Llama 3.1泄密:4050亿参数,下载链接、模型卡都有了