String面试题本质是判断内存位置(常量池/堆)、对象是否相同(==比地址)、值是否相等(equals比内容):双引号字面量入常量池,new String()在堆创建,intern()尝试将堆中字符串移入常量池;全字面量拼接编译期优化进池,含变量拼接运行时用StringBuilder生成堆对象;String不可变,所有操作返回新对象。

直接看核心逻辑,别背答案。String面试题本质就三件事:内存位置在哪、对象是否相同、值是否相等。抓住这三点,90%的题目一眼就能判。
先搞清两个关键内存区域
字符串常量池(方法区)和堆内存是理解所有String题的根基:
- 双引号创建的字符串(如 "abc")优先进常量池,重复值复用同一地址
- new String("abc")一定在堆里新建对象,哪怕池里已有相同内容
- intern()是“搬家公司”——把堆里的字符串尝试挪进常量池,若池中已存在则返回池中引用
== 和 equals 到底比什么
==只认内存地址,equals才比内容(且String重写了equals,逐字符比较):
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- "a" + "b" == "ab" → true(编译期优化,结果仍在常量池)
- new String("ab") == "ab" → false(堆 vs 池,地址不同)
- new String("ab").equals("ab") → true(内容一样)
- new String("ab").intern() == "ab" → true(搬进池后地址一致)
拼接行为要看“谁参与”
字符串拼接不是统一逻辑,得看操作数类型:
立即学习“Java免费学习笔记(深入)”;
- 全为字面量("a" + "b" + "c")→ 编译期合并,结果进常量池
- 含变量(str + "b" 或 "a" + str)→ 运行时用StringBuilder拼,结果在堆
- str += "x" 等价于 str = new StringBuilder(str).append("x").toString(),每次生成新对象
不可变性带来的连锁反应
String类被final修饰,内部value数组也final(JDK9+是byte[]),所以:
- 所有看似“修改”的方法(replace、substring、concat等)都返回新对象,原字符串不变
- 适合做HashMap键——哈希值可缓存,线程安全,不会因内容突变导致散列错乱
- 敏感信息(如密码)用String存储有风险——无法清空内存,建议改用char[]

















