字符串方法intern()详解_intern方法_煎丶包的博客-CSDN博客

public class intern {
    public static void main(String[] args) {
        String str1 = new StringBuilder("hello").append("world").toString();
        System.out.println(str1); // helloword(堆上)
        System.out.println(str1.intern()); // helloword(堆上)
        System.out.println(str1 == str1.intern()); // true

        System.out.println();

        String str2 = new StringBuilder("ja").append("va").toString();
        System.out.println(str2); // java(堆上)
        System.out.println(str2.intern()); // java(常量池中)
        System.out.println(str2 == str2.intern()); // false
    }
}

StringBuilder创建的字符串对象是在堆上调用intern()方法会把这个字符串对象实例引用放到字符串常量池,并返回这个字符串对象的引用。因此intern()返回的引用和由StringBuilder创建的那个字符串实例就是同一个对象

上述代码都是创建了一个字符串对象并调用intern()方法把这个字符串对象引用放到了字符串常量池中,但是“helloworld”字符串返回true,而“java”字符串却返回的是false,这说明“java”这个字符串之前已经创建过,并把引用存放在了字符串常量池中。

实际上这个“java”字符串,早就在系统进行初始化时,类加载器加载一些必需的类sun.misc.Version这个类的时候,这个“java”字符串就已经进入常量池。

Untitled

intern()的本质是改变字符串引用的方向,让等价字符串对象的引用都指向同一个字符串对象,使得多余的等价字符串对象可以被回收。