【知识点003】intern关键字的作用

在 Java 中,String.intern() 是一个用于字符串池(String Pool)优化的方法,它的作用是:

1. 核心作用

  • 将字符串对象添加到字符串常量池(String Pool),并返回池中的引用。
  • 如果字符串池中已存在相同内容的字符串,则直接返回池中的引用,避免重复创建。

2. 字符串池(String Pool)的背景

  • Java 为了优化内存,维护了一个字符串常量池(位于方法区,JDK 7+ 后移至堆内存)。
  • 使用双引号 "..." 直接创建的字符串会自动放入池中(如 String s = "hello")。
  • new String("...") 创建的字符串不会自动入池(除非显式调用 intern())。

3. intern() 的典型使用场景

(1) 减少重复字符串的内存占用

String s1 = new String("hello");  // 堆中新建对象,不入池
String s2 = s1.intern();          // 检查池中是否有 "hello",有则返回池中引用
String s3 = "hello";              // 直接使用池中的 "hello"

System.out.println(s1 == s2);     // false(s1在堆,s2指向池)
System.out.println(s2 == s3);     // true(都指向池中的同一个对象)

(2) 优化大量重复字符串的场景

// 假设从文件/网络读取大量重复字符串
String[] data = readLargeData();
for (String str : data) {
    str = str.intern();  // 入池,后续相同字符串复用池中对象
}

4. 注意事项

  • 性能影响intern() 需要检查字符串池,可能影响性能,不宜滥用(特别是在高频调用的代码中)。
  • 手动入池 vs 自动入池
    • String s = "abc"(自动入池)
    • String s = new String("abc").intern()(手动入池)
  • JDK 6 vs JDK 7+
    • JDK 6:字符串池在永久代(PermGen),可能导致 OutOfMemoryError
    • JDK 7+:字符串池移至堆内存,减少了永久代溢出的风险。

5. 总结

场景 是否使用 intern() 说明
需要复用大量相同字符串 ✅ 推荐 减少内存占用
高频调用或短生命周期字符串 ❌ 避免 可能增加开销
直接使用字面量("..." ❌ 不需要 自动入池

适用场景举例:解析 CSV/JSON 时,字段值可能重复,使用 intern() 可节省内存。
慎用场景:高并发或短生命周期的字符串操作。

posted @ 2025-07-08 12:59  兔麻吕  阅读(46)  评论(0)    收藏  举报