在 Java 中,String.intern() 的核心作用是把字符串放入字符串常量池(String Pool),实现复用,节省内存并支持快速比较。下面从原理、动机和使用场景讲清楚。
String 是不可变的"abc")会进入 字符串常量池new String("abc") 会在堆中新建对象,不一定在常量池String a = "abc";
String b = new String("abc");
System.out.println(a == b); // false
intern() 方法:
如果常量池中已经存在该字符串,返回池中的引用
如果不存在,把当前字符串加入常量池,并返回引用
String a = new String("abc");
String b = a.intern();
String c = "abc";
System.out.println(b == c); // true
当程序中存在大量重复字符串时(如从数据库、文件、网络中读取):
// 不 intern:成千上万个相同内容的 String 对象
String s = readFromDb();
// intern 后:只保留一份
String s = readFromDb().intern();
✅ 避免堆内存被重复字符串占满
== 比较效率== 比较的是引用,比 equals() 快
if (a.intern() == b.intern()) {
// 快速判断内容是否相同
}
⚠️ 但一般仍推荐用 equals(),可读性更好
s.intern(); // 不会造成永久代溢出
✅ 适合:
❌ 不适合:
String.intern() 的本质是“字符串去重 + 池化复用”,用空间换时间,或用时间换内存,关键是看重复率。
如果你愿意,我也可以给你画一张 堆 vs 字符串常量池 的示意图,或结合一个真实性能优化案例讲。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。