在 Java 中,String 常量池(String Pool,也叫字符串常量池) 是 JVM 为了提高性能、节省内存而设计的一块特殊存储区域,用来存放字符串字面量(String literal)和被显式放入池中的字符串对象。
下面从几个关键点来说明。
字符串常量池是 JVM 中一块存储 String 对象引用的内存区域(在 JDK 7 之后位于堆中,之前在方法区/永久代)。
它的核心特点是:
相同的字符串字面量,在池中只存在一份
String a = "abc";
String b = "abc";
"abc" 是字符串字面量System.out.println(a == b); // true
String.intern()String s1 = new String("abc");
String s2 = s1.intern();
String s3 = "abc";
System.out.println(s2 == s3); // true
intern():
new String() 和常量池的区别(重点)String a = "abc";
String b = new String("abc");
| 方式 | 是否在池中 | 是否新建对象 |
|---|---|---|
"abc" |
✅ 在池中 | ❌ 不新建(复用) |
new String("abc") |
❌ 不在池中 | ✅ 新建堆对象 |
System.out.println(a == b); // false
new String("abc")至少创建一个对象(池中可能有,也可能没有)
例如:
"hello" // 成千上万次使用
如果每次都 new,内存爆炸。
| JDK 版本 | 常量池位置 |
|---|---|
| JDK 6 及之前 | 方法区(PermGen) |
| JDK 7 | 堆(Heap) |
| JDK 8+ | 堆(Metaspace 管理类信息,但字符串仍在堆) |
❓ == 和 equals 区别?
== // 比较引用(地址)
equals // 比较内容
❓ 下面输出什么?
String s1 = "a" + "b";
String s2 = "ab";
System.out.println(s1 == s2); // true(编译期优化)
❓ 下面输出什么?
String s1 = "a";
String s2 = s1 + "b";
System.out.println(s2 == "ab"); // false
String 常量池是 JVM 用来存储字符串字面量、避免重复创建字符串对象的一块内存区域;使用字面量或
intern()才能进入池中。
如果你愿意,我可以:
StringBuilder 和常量池关系免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。