【知识点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+:字符串池移至堆内存,减少了永久代溢出的风险。
- JDK 6:字符串池在永久代(PermGen),可能导致
5. 总结
| 场景 | 是否使用 intern() |
说明 |
|---|---|---|
| 需要复用大量相同字符串 | ✅ 推荐 | 减少内存占用 |
| 高频调用或短生命周期字符串 | ❌ 避免 | 可能增加开销 |
直接使用字面量("...") |
❌ 不需要 | 自动入池 |
适用场景举例:解析 CSV/JSON 时,字段值可能重复,使用 intern() 可节省内存。
慎用场景:高并发或短生命周期的字符串操作。

浙公网安备 33010602011771号