【问题标题】:String.intern() shows strange result, how does it workString.intern() 显示奇怪的结果,它是如何工作的
【发布时间】:2021-04-10 23:25:07
【问题描述】:

我知道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");
    }

输出是:

是的

有什么区别。

【问题讨论】:

    标签: java string jvm intern string-constant


    【解决方案1】:

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

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

    第一个sn-p:

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

    第二次sn-p:

    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 对象的引用... 所有文字字符串和字符串值常量表达式都被保留

    【讨论】:

    • this answer 中已使用此差异来检测池中是否已存在字符串。在运行时将字符串文字解析为字符串对象时。
    猜你喜欢
    • 2016-10-04
    • 2015-01-13
    • 2018-05-28
    • 1970-01-01
    • 2016-11-19
    • 2014-11-22
    • 2013-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多