String高分关键在于讲清“为什么”:不可变性(final数组+私有封装→线程安全/常量池复用/HashMap key可靠)、常量池机制(字面量复用vs new堆创建)、==与equals底层逻辑(引用判等→类型长度校验→逐字符比较)。

想在面试中关于 String 拿高分,关键不是背结论,而是能说清“为什么”——尤其要抓住三个锚点:不可变性、常量池机制、== 与 equals 的底层逻辑。面试官真正想看的,是你能不能把现象和 JVM 内存模型、源码实现串起来讲。
紧扣不可变性讲透行为和影响
别只说“String 不可变”,要带出三层含义:
- 底层是 final byte[](JDK9+)或 final char[](JDK8-),数组地址锁死 + 内容封装私有,外部无法修改;
- 所有操作(concat、replace、substring 等)都返回新对象,原字符串毫发无损;
- 正因不可变,才能线程安全、支持常量池复用、可放心作 HashMap key 或网络参数——这三点必须各举一个实际场景,比如“多个线程同时读取配置字符串,不用加锁”。
常量池要区分字面量 vs new 创建
这是高频陷阱题的核心。一句话说清区别:
- String s = "abc":先查字符串常量池,有则复用,无则入池并返回引用;
- String s = new String("abc"):一定在堆新建对象,同时常量池也确保有"abc"(如果还没有);所以严格来说是“最多两个对象”,JVM 可能已存在该字面量,此时只创建堆对象;
- 验证手段:用 == 比较地址,用 intern() 强制归池再比——比如 new String("abc").intern() == "abc" 一定为 true。
== 和 equals 必须从源码逻辑展开
光说“== 比地址,equals 比内容”不够。要还原 String.equals() 的真实流程:
立即学习“Java免费学习笔记(深入)”;
- 先 if (this == anObject) return true;——快速判同引用,避免后续开销;
- 再检查类型是否为 String,长度是否相等;
- 最后逐字节/字符比较(JDK9+ 是 byte 数组,注意编码标识);
- 顺带点明:重写 equals 就必须重写 hashCode,因为 HashMap 依赖两者一致性——比如两个 equals 为 true 的字符串,hashCode 不同会导致 put 进去后 get 不到。
遇到拼接题,主动补一句 JVM 优化
看到 "a" + "b" + "c" 这类代码,别只答结果,加半句优化说明:
- 编译期常量拼接会被直接优化成 "abc",进常量池;
- 变量参与拼接(如 s1 + "b")则走 StringBuilder.append,运行时生成新对象;
- 顺便对比 StringBuffer(线程安全,synchronized)和 StringBuilder(非线程安全,快),点明适用场景——比如日志拼接用 StringBuilder,多线程配置组装用 StringBuffer。


















