news 2026/7/22 2:01:40

【Java】一文搞懂String源码

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Java】一文搞懂String源码

这个标题一看就是冲着面试 + 深入理解去的,那我就按
“源码结构 → 设计思想 → 关键方法 → 易错点 → 面试总结”
帮你把Java String 源码一篇讲透 👇

说明:以下基于JDK 8(JDK 9+ 有压缩字符串差异,我后面会单独点)


一、String 是什么?

publicfinalclassStringimplementsjava.io.Serializable,Comparable<String>,CharSequence

关键信息

  • final不可被继承

  • 实现接口:

    • Serializable(可序列化)
    • Comparable(可比较)
    • CharSequence(字符序列)

👉 设计目标:
安全、不可变、可复用、线程安全


二、String 的底层数据结构

1️⃣ JDK 8 之前(含 JDK 8)

privatefinalchar[]value;
  • 使用char数组
  • 每个char占 2 字节(UTF-16)

2️⃣ JDK 9+(了解)

privatefinalbyte[]value;privatefinalbytecoder;
  • LATIN1(1 字节)
  • UTF16(2 字节)
  • 节省内存(压缩字符串)

三、String 为什么是不可变的?

源码核心:

privatefinalchar[]value;

不可变的三个关键点

  1. valuefinal
  2. 没有提供修改内部数组的方法
  3. 所有“修改”操作都会new 新对象
Strings="abc";s=s.concat("d");// 新对象

不可变的好处

✅ 线程安全
✅ 可缓存 hashCode
✅ 适合做 Map 的 key
✅ 字符串常量池可复用


四、String 的构造方法源码要点

1️⃣ 使用字面量

Strings="abc";
  • 放入字符串常量池
  • 相同字面量只创建一个对象

2️⃣ new String()

Strings=newString("abc");
  • 堆中一个新对象
  • 常量池中仍然有"abc"

👉一共两个对象


五、equals() 与 == 的区别(源码级)

equals 源码核心

publicbooleanequals(ObjectanObject){if(this==anObject)returntrue;if(anObjectinstanceofString){StringaString=(String)anObject;if(value.length==aString.value.length){for(inti=0;i<value.length;i++){if(value[i]!=aString.value[i]){returnfalse;}}returntrue;}}returnfalse;}

👉逐字符比较内容


== 比较的是?

  • 对象引用地址

六、hashCode() 为什么只算一次?

privateinthash;// 默认 0publicinthashCode(){inth=hash;if(h==0&&value.length>0){for(charc:value){h=31*h+c;}hash=h;}returnh;}

设计点

  • 懒加载
  • 只算一次,后续直接返回
  • 不可变 → hash 永远不变

七、String + 拼接的底层原理

1️⃣ 常量拼接(编译期)

Strings="a"+"b";

⬇ 编译后

Strings="ab";

2️⃣ 变量拼接(运行期)

Strings=a+b;

⬇ 实际是

newStringBuilder().append(a).append(b).toString();

👉循环拼接字符串要用 StringBuilder


八、String.intern() 原理

Strings=newString("abc");s.intern();
  • JDK 7+:

    • 常量池存的是堆中对象引用
  • 如果池中没有:

    • 放入当前对象引用
  • 如果有:

    • 返回池中引用

九、String / StringBuilder / StringBuffer

可变线程安全性能
String
StringBuilder
StringBuffer

十、面试高频坑点总结

❗ 1. String 为什么是 final?

  • 防止被继承破坏不可变性

❗ 2. String 真的不可变吗?

  • 引用可变,对象内容不可变

❗ 3. String 做 HashMap key 为什么安全?

  • hash 不变
  • equals 稳定

十一、一句话终极总结(面试必背)

String 是一个不可变的、基于字符数组实现的类,通过常量池实现复用,hashCode 缓存提升性能,字符串拼接底层依赖 StringBuilder。


如果你愿意,我可以继续给你:

  • 🔥JDK 9 String 压缩字符串源码
  • 🔥String.intern() 面试追问
  • 🔥字符串常量池 + JVM 内存结构
  • 🔥String 面试题 20 连击

你是准备 Java 面试,还是深入看 JDK 源码

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/1 23:27:15

现代互联网安全的基石: SSL/TLS技术介绍

这个标题本身就很“架构级”&#xff0c;也是安全 / 后端 / 面试必考内容。 我会按 为什么需要 → TLS 在解决什么 → 工作流程 → 核心技术 → 常见误区 → 面试总结&#xff0c;带你系统搞懂 SSL/TLS。 现代互联网安全的基石&#xff1a;SSL/TLS 技术介绍 一、为什么需要 SSL…

作者头像 李华
网站建设 2026/7/13 20:25:31

【C语言】 关键字与用户标识符

好&#xff0c;这一块是 C 语言入门的“地基”&#xff0c;也是考试和面试经常考的基础点。 我按 概念 → 规则 → 分类 → 示例 → 常见错误 给你一篇清晰好记的说明。 【C语言】关键字与用户标识符 一、什么是关键字&#xff08;Keyword&#xff09; 1️⃣ 定义 关键字是 C …

作者头像 李华
网站建设 2026/7/16 4:45:24

业务面试官总“掉链子”?HR该出手了

招聘中&#xff0c;HR精心推荐的候选人&#xff0c;常因业务面试官不了解岗位或体验不佳而流失&#xff0c;而面试官也抱怨找不到合适人选。这凸显了招聘中“筛选”与“专业评估”的脱节。业务面试官是领域专家&#xff0c;而非面试专家。HR的价值在于通过专业流程与工具&#…

作者头像 李华
网站建设 2026/7/20 21:51:00

【Linux命令大全】008.磁盘维护之swapoff命令(实操篇)

【Linux命令大全】008.磁盘维护之swapoff命令&#xff08;实操篇&#xff09; ✨ 本文为Linux系统磁盘维护命令的全面汇总与深度优化&#xff0c;结合图标、结构化排版与实用技巧&#xff0c;专为高级用户和系统管理员打造。 (关注不迷路哈&#xff01;&#xff01;&#xff01…

作者头像 李华
网站建设 2026/7/14 23:25:00

【Linux命令大全】008.磁盘维护之symlinks命令(实操篇)

【Linux命令大全】008.磁盘维护之symlinks命令&#xff08;实操篇&#xff09; ✨ 本文为Linux系统磁盘维护命令的全面汇总与深度优化&#xff0c;结合图标、结构化排版与实用技巧&#xff0c;专为高级用户和系统管理员打造。 (关注不迷路哈&#xff01;&#xff01;&#xff0…

作者头像 李华
网站建设 2026/7/14 23:26:40

从外包菜鸟到高手,XinServer 是我的秘密武器

从外包菜鸟到高手&#xff0c;XinServer 是我的秘密武器 兄弟们&#xff0c;不知道你们有没有过这种经历&#xff1a;老板或者客户拍着桌子说&#xff0c;“这个功能很简单&#xff0c;不就是个增删改查吗&#xff1f;下周一能上线不&#xff1f;” 你表面笑嘻嘻&#xff0c;心…

作者头像 李华