Java intern() 方法

Java String类Java String类


intern() 方法用于在运行时将字符串添加到内部的字符串池中,并返回字符串池中的引用。

当调用 intern() 方法时,如果字符串常量池已经包含该字符串,则返回池中的引用,如果池中没有该字符串,则将其添加到池中,并返回该字符串的引用。

intern() 方法遵循以下规则:对于任意两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。

String s1 = new String("Hello");
String s2 = "Hello";
String s3 = s1.intern();

System.out.println(s1 == s2);  // false
System.out.println(s2 == s3);  // true

语法

public String intern()

参数

返回值

intern() 方法的返回值是字符串在字符串常量池(String Pool)中的引用。

返回值规则:

  • 如果字符串常量池已存在该字符串:返回池中已有字符串的引用。
  • 如果字符串常量池不存在该字符串:将当前堆中的字符串引用存入常量池(而非创建新对象),并返回该引用。

Java 版本差异:

  • 在 JDK 6 及之前,字符串常量池存储在方法区(永久代),容量有限,过多使用 intern() 可能导致 OutOfMemoryError。

  • JDK 7 及以上,字符串常量池移动到了堆内存,可以存储更多数据。

实例

以下实例演示了intern() 方法的应用:

实例

public class RunoobTest {
    public static void main(String args[]) {
        // str1 直接赋值字符串字面量 "Runoob",它存储在字符串常量池(String Pool)中
        String str1 = "Runoob";

        // str2 使用 new 关键字创建,它存储在堆(Heap)内存中
        String str2 = new String("Runoob");

        // str3 是 str2 调用 intern() 方法后得到的引用
        // intern() 方法会将 "Runoob" 放入字符串常量池,并返回池中的引用
        String str3 = str2.intern();

        // str1 和 str2 比较
        // str1 指向常量池中的 "Runoob",str2 指向的是堆内存中的对象
        // 由于它们的地址不同,结果为 false
        System.out.println(str1 == str2);  // false

        // str1 和 str3 比较
        // str3 是 str2 调用 intern() 方法后返回的引用,它指向常量池中的 "Runoob"
        // 而 str1 也是指向常量池中的 "Runoob",因此它们的地址相同,结果为 true
        System.out.println(str1 == str3);  // true
    }
}

代码说明:

String str1 = "Runoob";

  • 直接赋值字符串字面量 "Runoob",它会自动存储在字符串常量池(String Pool)中。

String str2 = new String("Runoob");

  • 由于使用 new 关键字,它会在堆(Heap)中创建一个新的字符串对象,即 str2 不指向常量池,而是指向一个新的内存地址。

String str3 = str2.intern();

  • intern() 方法检查字符串 "Runoob" 是否已经存在于字符串常量池

    • 如果存在,返回该字符串的引用;

    • 如果不存在,则将其添加到常量池并返回池中的引用。

  • 由于 str1 已经在常量池中,str3str1 指向同一个对象。

System.out.println(str1 == str2);

  • str1 指向常量池str2 指向堆中的对象,所以 == 比较的是不同的内存地址,结果 false

System.out.println(str1 == str3);

  • str3 经过 intern() 之后,指向常量池中的字符串,与 str1 指向相同的对象,结果 true

以上程序执行结果为:

false
true

Java String类Java String类