在 Java 中,**String 常量池(String Pool / String Constant Pool)**存在的主要原因可以归纳为:节省内存、提升性能、支持字符串复用。下面从设计动机和实现机制两个层面解释。
在几乎所有 Java 程序中,字符串都是使用最多的对象类型之一(日志、配置、SQL、JSON、网络通信等)。
如果不加控制地创建字符串对象:
String 在 Java 中被设计为 final + 不可变:
String a = "abc";
String b = "abc";
因为内容永远不会改变,所以:
这是常量池能够存在的前提条件。
String s1 = "hello";
String s2 = "hello";
"hello" 只会在常量池中创建一次s1 和 s2 指向同一个对象✅ 节省内存
✅ 提高比较效率(== 也可判断内容相同)
HashMap key、equals 比较等场景String s = "a" + "b"; // 编译期优化为 "ab"
编译器会直接将结果放入常量池,而不是运行时拼接。
这样可以避免永久代内存溢出问题。
String a = "abc"; // 常量池
String b = new String("abc"); // 堆中新建对象
a == b → falsea.equals(b) → true可以使用:
b = b.intern();
将字符串放入常量池(如果不存在则加入,返回池中的引用)。
Java 设计 String 常量池,是因为字符串不可变且使用极其频繁,通过复用相同字符串对象,可以显著节省内存并提升性能。
如果你愿意,我也可以讲:
intern() 的底层原理+ vs StringBuilder)免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。