温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java String 为何用 intern

发布时间:2026-10-26 13:08:04 来源:亿速云 阅读:99 作者:小樊 栏目:编程语言

在 Java 中,String.intern() 的核心作用是把字符串放入字符串常量池(String Pool),实现复用,节省内存并支持快速比较。下面从原理、动机和使用场景讲清楚。


一、String 的基本性质

  • Java 中 String 是不可变的
  • 使用字面量创建的字符串(如 "abc")会进入 字符串常量池
  • 使用 new String("abc") 会在堆中新建对象,不一定在常量池
String a = "abc";
String b = new String("abc");
System.out.println(a == b); // false

二、intern() 做了什么

intern() 方法:

如果常量池中已经存在该字符串,返回池中的引用
如果不存在,把当前字符串加入常量池,并返回引用

String a = new String("abc");
String b = a.intern();
String c = "abc";

System.out.println(b == c); // true

三、为什么要使用 intern()

1️⃣ 节省内存(最重要)

当程序中存在大量重复字符串时(如从数据库、文件、网络中读取):

// 不 intern:成千上万个相同内容的 String 对象
String s = readFromDb(); 

// intern 后:只保留一份
String s = readFromDb().intern();

✅ 避免堆内存被重复字符串占满


2️⃣ 提高 == 比较效率

== 比较的是引用,比 equals() 快

if (a.intern() == b.intern()) {
    // 快速判断内容是否相同
}

⚠️ 但一般仍推荐用 equals(),可读性更好


3️⃣ 控制字符串生命周期(JDK 7+)

  • JDK 6:常量池在 永久代(PermGen),容易 OOM
  • JDK 7+:常量池移到 堆中
s.intern(); // 不会造成永久代溢出

四、典型使用场景

✅ 适合:

  • 大量重复字符串(用户名、IP、URL、字典值)
  • 长生命周期、高重复率的数据

❌ 不适合:

  • 字符串内容几乎不重复
  • 高频创建 + intern(常量池有锁,可能影响性能)

五、注意事项

  1. 不要滥用 intern
    • 常量池也是有限资源
  2. intern 有性能成本
    • 需要查表(类似 HashMap)
  3. JDK 版本差异明显
    • JDK 6 vs JDK 7+ 行为不同

六、一句话总结

String.intern() 的本质是“字符串去重 + 池化复用”,用空间换时间,或用时间换内存,关键是看重复率。

如果你愿意,我也可以给你画一张 堆 vs 字符串常量池 的示意图,或结合一个真实性能优化案例讲。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手