java string面试核心是串联不可变性、常量池与==/equals区别:string类final且内部数组private final,所有操作均新建对象;字面量入常量池复用,new在堆创建新对象;==比较地址,equals比较内容且有空指针风险。

直接上干货:Java String 面试题不是考背诵,而是考你能不能把“不可变性”“常量池”“==与equals区别”这三根主线串起来,再结合内存行为讲清楚每行代码在干什么。
抓住三个必考底层逻辑
几乎所有String面试题都绕不开这三个点,答错一个就容易被追问到底:
- 不可变性是设计根基:String类被final修饰,内部char[](JDK8)或byte[](JDK9+)也是private final。任何操作如concat、substring、replace,都不改原对象,而是new一个新String。这是线程安全和常量池复用的前提。
- 字符串常量池只存字面量:String s = "abc" → 检查常量池,有则复用,无则创建并放入;而new String("abc") → 一定在堆中新建对象,常量池里那个"abc"只是被它内部引用,不等于它自己。
- ==比地址,equals比内容:==对String就是看是不是同一个对象(地址相同);equals先判地址,再逐字符比内容。注意:equals(null)会抛NullPointerException,调用前最好判空。
高频题型与拆解要点
面试官常从一段小代码切入,重点看你能否说清每步的内存动作:
- 常量池判断题:如String a="123"; String b="123"; System.out.println(a==b); → 输出true,因为字面量自动入池且复用。
- new vs 字面量对比题:String x=new String("456"); String y="456"; System.out.println(x==y); → 输出false(x在堆,y在池),但x.equals(y)为true。
- intern()考点题:String z=new String("789").intern(); String w="789"; System.out.println(z==w); → 输出true,因为intern()强制将堆中字符串“登记”进常量池,返回池中引用。
StringBuilder和StringBuffer怎么选
别只背“StringBuffer线程安全”,要讲清实际场景:
- 单线程大量拼接(如循环生成SQL)→ 用StringBuilder,性能高,无同步开销。
- 多线程共享拼接(如日志聚合器)→ 用StringBuffer,方法加synchronized,但吞吐量低。
- String拼接用+号?编译器会自动优化成StringBuilder.append,但仅限于编译期确定的常量拼接(如"ab"+"c");运行时变量拼接(如str1+str2)仍建议显式用StringBuilder。
常被忽略但加分的细节
说到就显得你真看过源码、写过压测:
- JDK9起String底层改用byte[] + coder字段,节省英文/数字内存;但中文仍用UTF-16,每个字符占2字节。
- String的hashCode是懒计算:第一次调用才算并缓存到hash字段,之后直接返回。这也是不可变性带来的优化。
- strip()和trim()区别:trim只去首尾ASCII空格(\u0000-\u0020),strip支持Unicode全宽空格、换行符等,更彻底。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











