字符串池是JVM堆中专存字面量字符串的区域,仅收录双引号创建的字符串以复用对象;new String()总在堆新建,intern()可将其加入池;JDK7起池位于堆内存,受GC管理;==比较地址,equals比较内容。
字符串池(String Pool)不是“缓存”,也不是“工具类”,它是JVM在堆内存中维护的一块专用区域,专门用来收留字面量字符串,目标就一个:避免重复对象、节省内存、加速比较。
只有用 "abc" 这种方式定义的字符串,才会被自动检查并放入池中。比如:
String a = "hello"; → JVM查池,无则新建,有则复用,a 指向池中对象
String b = "hello"; → 再次查池,发现已有,b 和 a 指向同一地址 → a == b 为 trueString c = new String("hello"); → 先确保池里有"hello",再强制在堆里新建一个String实例,c 指向堆中对象,不等于 a 或 bnew String(...) 总是在堆中新建对象,跟池无关。但调用 .intern() 就像递上一张通行证:
new String("abc").intern() == "abc" 一定为 true从 JDK7 开始,字符串池就移到了堆内存(不是方法区、不是元空间)。这意味着:
这是池机制最直接的体现:
"x
" == "x" → true(同在池,同一地址)new String("x") == new String("x") → false(两个堆对象,地址不同)new String("x").equals(new String("x")) → true(内容一样)基本上就这些。理解池的关键不在背规则,而在记住:池只认字面量;new 总是堆里新造;intern 是手动“归档”操作;== 只有在双方都来自池时才安全。