Java中intern()方法的使用小结
作者:ruan114514
本文主要介绍了Java中intern()方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
在Java中,字符串处理是日常开发的核心操作之一。而String.intern()
方法作为String
类的一个特殊方法,与Java的字符串常量池(String Pool)紧密相关。本文将深入剖析intern()
的工作原理、使用场景和潜在陷阱,助你高效管理字符串内存。
一、字符串常量池:背景知识
Java为了优化字符串内存占用,设计了字符串常量池(位于堆内存中)。当创建字符串字面量(如"hello"
)时,JVM会先检查池中是否存在相同内容的字符串:
- 若存在,直接返回池中的引用;
- 若不存在,将字符串放入池中再返回引用。
这种机制避免了重复字符串的内存浪费。
二、intern()方法的作用
intern()
是一个本地方法(Native Method),其行为如下:
String str1 = new String("hello"); // 在堆中创建新对象 String str2 = "hello"; // 使用常量池中的对象 String str3 = str1.intern(); // 将str1的内容放入常量池(若不存在)并返回池中引用 System.out.println(str1 == str2); // false(不同对象) System.out.println(str2 == str3); // true(指向同一对象)
核心逻辑:
调用intern()
时,若常量池中已存在等值字符串,则返回其引用;否则将该字符串加入池中并返回引用(JDK7+的行为,详见下文)。
三、JDK版本的关键差异
1. JDK6及之前
- 字符串池位于永久代(PermGen),大小有限易触发
OutOfMemoryError
。 intern()
会将字符串复制到永久代。
2. JDK7+
- 字符串池移至堆内存,支持动态扩展。
intern()
不再复制字符串,而是记录堆中已有字符串的引用,节省内存。
四、典型使用场景
减少重复字符串内存占用
适用于大量重复字符串的场景(如日志处理):
List<String> strings = new ArrayList<>(); for (int i = 0; i < 100_000; i++) { String temp = new String("重复数据").intern(); // 指向池中唯一对象 strings.add(temp); }
加速字符串比较intern()
后可用==
代替equals()
(谨慎使用!):
String a = new String("data").intern(); String b = new String("data").intern(); System.out.println(a == b); // true
到此这篇关于Java中intern()方法的使用小结的文章就介绍到这了,更多相关Java intern()内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!