首页 > 解决方案 > String.intern() 显示奇怪的结果,它是如何工作的

问题描述

我知道如果 String.intern() 不包含对象,它会将字符串添加到池中,但是如何解释结果。

下面的代码:

public static void main(String[] args) {

        char[] abc = new char[]{'a','b','c'};
        String str = new String(abc);
        System.out.println(str == "abc");
        str.intern();
        System.out.println(str == "abc");
    }

输出是:

错误的

错误的

但是,当代码如下:

public static void main(String[] args) {

        char[] abc = new char[]{'a','b','c'};
        String str = new String(abc);
        str.intern();
        System.out.println(str == "abc");
    }

输出是:

真的

有什么不同。

标签: javastringjvminternstring-constant

解决方案


不同之处在于,当您String在显式调用 之前使用文字“abc”时intern,它是隐式实习的。

str.intern()如果池中已经存在相等的值,则不会将引用的实例存储str在字符串String池中。

第一个片段:

System.out.println(str == "abc"); // "abc" is interned
str.intern(); // str is not stored in the pool
System.out.println(str == "abc"); // returns false

第二个片段:

str.intern(); // str is stored in the pool
System.out.println(str == "abc"); // returns true

来自实习生的 Javadoc:

字符串 java.lang.String.intern()

当调用 intern 方法时,如果池中已经包含一个等于该 String 对象的字符串,由 equals(Object) 方法确定,则返回池中的字符串。否则,将此 String 对象添加到池中并返回对此 String 对象的引用... 所有文字字符串和字符串值常量表达式都是 interned


推荐阅读