Java String面试核心是理清对象创建路径、内存区域归属和不可变性影响三条主线:字面量走常量池,new创建堆对象,拼接分编译期优化与运行时构建,不可变性决定线程安全与性能选择。

看Java String相关的思维导图面试题,核心不是死记结论,而是理清“对象创建路径 + 内存区域归属 + 不可变性影响”这三条主线。
重点盯住字符串创建方式和内存分布
面试常考的几类写法,必须能立刻对应到内存行为:
- String s = "abc"; → 只涉及字符串常量池(JDK7+在堆中),若池中已存在"abc",不新建实例;否则新建并入池
- String s = new String("abc"); → 至少创建1个堆对象;若常量池无"abc",则先入池再new,共2个String实例(池中1个 + 堆中1个)
- String s1 = "ab", s2 = "c"; String s3 = s1 + s2; → 编译期不可确定,运行时用StringBuilder拼接,结果在堆中,不会自动入常量池
- String s3 = "ab" + "c"; → 编译期优化为"abc",直接走常量池逻辑,只生成1个实例
紧扣“不可变性”推导所有行为
String被final修饰、value是private final char[],意味着:
- 所有修改操作(concat、replace、substring等)都返回新String对象,原对象不变
- 因此频繁拼接用String效率低,应改用StringBuilder(单线程)或StringBuffer(多线程)
- 作为HashMap键安全——因为哈希值计算后不会变,且equals/hashCode契约稳定
对比类要落在“线程安全”和“性能场景”上
String、StringBuffer、StringBuilder三者差异不能只背“是否线程安全”,得说清为什么:
立即学习“Java免费学习笔记(深入)”;
- String:不可变 → 天然线程安全,适合做常量、键、配置项
- StringBuffer:所有public方法加synchronized → 线程安全但有锁开销,适合多线程拼接场景(如Servlet中构造响应体)
- StringBuilder:无同步 → 性能最好,日常单线程拼接首选(如for循环内构建日志)
警惕高频陷阱题的底层依据
比如问“String s = new String("xyz") 创建几个对象?”,光答“1个或2个”不够,要补一句:
取决于常量池是否已存在"xyz";而是否已存在,又取决于此前是否有"xyz"字面量或intern()调用。没有上下文,答案就不完整。


















