登录
首页 >  文章 >  java教程

char改byte内存变化详解

时间:2026-04-17 15:54:43 487浏览 收藏

Java 9引入的字符串底层优化——将String从固定2字节/字符的char[]改为动态选择1字节(Latin-1)或2字节(UTF-16)存储的byte[]加coder标志位机制,实现了对英文、数字等高频字符的内存“精准瘦身”,在不改变任何API行为、无需开发者干预的前提下,显著降低堆内存占用(如"hello"从10字节减至5字节),真正做到了智能省空间而不牺牲功能与兼容性。

新手教程:怎么理解String底层由char数组改版为byte数组的内存变化

这个改动核心就一点:让字符串更省内存,尤其对英文、数字这类常见字符。

为什么原来char[]浪费空间?

Java 8 及之前,String 内部用 char[] 存字符,每个 char 固定占 2 个字节(16 位),不管它是不是只需要 1 个字节就能表示。

比如:

  • "hello" 是 5 个 ASCII 字符 → 原来要占 5 × 2 = 10 字节
  • "你好" 是 2 个中文字符 → 也占 2 × 2 = 4 字节(UTF-16 正常需要)

问题在于:现实中绝大多数字符串(80–90%)只含英文、数字、标点等 Latin-1 字符,完全可以用 1 字节存。但 char 强制占 2 字节,等于一半空间白占着。

改成byte[]后怎么省?

JDK 9 起,String 内部变成 byte[] + 一个 coder 标志位

  • 如果字符串全是 Latin-1 字符(比如 "abc123"),就用 1 字节/字符 存,coder = 0
  • 只要有一个非 Latin-1 字符(比如中文、emoji),就自动切到 UTF-16 模式,用 2 字节/字符 存,coder = 1

效果直观:

  • "hello" → 现在只占 5 字节(省了 5 字节)
  • "hello你好" → 前 5 个英文字母不能单独省,整个字符串按 UTF-16 存 → 7 × 2 = 14 字节

对开发者有什么影响?

日常写代码基本感觉不到变化:

  • .length().charAt().substring() 等方法行为完全一致,JVM 内部自动处理编码转换
  • 你不用手动选编码,也不用改任何逻辑 —— 这是 JVM 层的透明优化
  • 唯一要注意的是:别通过反射去修改 valuecoder 字段,会破坏一致性

一句话总结

不是简单把 char[] 换成 byte[],而是加了一层智能判断:能用 1 字节就绝不用 2 字节,该用 2 字节时也绝不妥协 —— 省空间不丢功能,这才是 Compact Strings 的真正意思。

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于文章的相关知识,也可关注golang学习网公众号。

资料下载
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>