string不可变:因private final char[] value且无修改方法;所有“修改”均新建对象;故线程安全、可作hashmap键、享字符串常量池。

直接看核心分支,别从根节点逐层点开——String面试重点就集中在不可变性、内存分配、创建方式、常用方法、与StringBuffer/StringBuilder对比这五块。
抓主线:不可变性是所有问题的起点
面试官问“为什么String是线程安全的”“new String(“abc”) 创建了几个对象”,答案都绕不开不可变性。关键记住三点:
- String内部用private final char[] value存储内容,一旦初始化就不能改
- 所有看似“修改”的操作(如
replace、substring、toUpperCase)实际都返回新对象,原字符串不变 - 不可变 → 天然线程安全 → 可放心作为HashMap的key或共享缓存
盯细节:字符串常量池和堆内存怎么分
这是高频易错点。思维导图里看到“常量池”“堆”“new”“字面量”这些词,要立刻反应出对应行为:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
String s1 = "abc"→ 查常量池,有则复用,无则入池 → 指向常量池地址 -
String s2 = new String("abc")→ 一定在堆中新建对象,同时常量池也可能新增(取决于是否已存在)→s1 == s2为false - JDK 7+ 常量池移到堆中,但逻辑没变:它仍是独立管理的区域,不是普通堆空间
查方法:只记高频且易混淆的5个API
不必背全表,重点搞清这几个的边界行为:
-
indexOf(String, int):从指定索引开始正向找,不是“跳过前n位” -
lastIndexOf(String, int):从指定索引开始反向找(含该位置),不是“从末尾往前数n位” -
substring(int begin):截取到末尾;substring(int begin, int end):含头不含尾,end越界抛StringIndexOutOfBoundsException -
equals()比内容,==比地址——哪怕两个字符串内容一样,new出来的也≠字面量 -
trim()只去ASCII空格(\u0020),不去\u3000中文空格或\t\n\r
辨对比:StringBuffer vs StringBuilder 必须说清一点
思维导图若把三者并列,考的就是你能否一句话点破本质区别:
- String:不可变,每次操作生成新对象,适合少量拼接或做key
- StringBuffer:可变,所有public方法加了
synchronized,线程安全但慢 - StringBuilder:可变,方法没同步,非线程安全但快——日常单线程场景默认选它
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










