String 源码分析
2026/8/24大约 1 分钟
String 源码分析
String 是不可变对象,理解常量池、编译期优化与
==比较的本质。
经典面试题
第一段代码:
String a = "a" + "b" + 1;
String b = "ab1";
System.out.println(a == b); // true第二段代码:
String a = new String("ab1");
String b = "ab1";
System.out.println(a == b); // false原因:第一段代码经过编译期优化——编译器发现 "a"+"b"+1 与 "ab1" 都是不可变常量,效果相同,直接折叠为常量 "ab1",因此 a 和 b 都指向常量池中的同一对象。
第二段代码中,new String("ab1") 在堆中创建新对象,b 指向常量池中的对象,两者地址不同,== 比较为 false。
String 类结构
public final class String
implements Serializable, Comparable<String>, CharSequence {
private final char value[]; // 不可变的 char 数组,存放字符串
private int hash; // 缓存的哈希值
}final修饰:String 对象是不可变量,并发程序最喜欢不可变量- 实现
Comparable(compareTo方法)、CharSequence(length、charAt、subSequence方法)
要点总结
| 知识点 | 说明 |
|---|---|
| 不可变性 | final 类 + final char 数组,无法修改 |
| 常量池 | 字面量创建时优先从常量池查找/复用 |
| 编译期优化 | 常量字符串拼接在编译期折叠 |
| 字符串拼接 | 大量拼接用 StringBuilder 避免产生过多对象 |
| equals 与 == | == 比地址,equals 比内容 |