在Java中使用Intern方法的不同之处

时间:2017-08-08 06:59:27

标签: java

这个问题可能很简单,只是为了确保100%确定要问它。这两种情况有什么区别 案例1:

this.store = new Ext.data.Store({
            autoLoad: true,
            url: 'NewJSON.json',
            storeId: 'projectDropDown',
            reader: new Ext.data.JsonReader(
            {
                root: 'ROOT'
            }),
            idProperty: 'ProjectID',
            fields: [ 'ID', 'Text' ]
        });

案例2:

{
    "ROOT": {
        "Tag": [{
            "ID": 01,
            "TEXT": "B"
        },
        {
            "ID": 02,
            "TEXT": "A"
        }]
    }
}

现在案例1打印为false,案例2打印为true。

有人可以解释原因吗?

2 个答案:

答案 0 :(得分:3)

在第一个示例中,您忽略了s2.intern()的返回值,它返回对池中String的引用(即s)。

因此s2仍引用原始的非池化字符串。

答案 1 :(得分:2)

String是不可变的,所以在你写的第一个例子中:

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

s2不会改变。所以这里:

System.out.println(s == s2);

您仍然将new String("Hello")"Hello"进行比较,不要引用同一个对象,因为其中一个字符串是使用new运算符创建的。

在第二个示例中,您将池值(使用intern())分配给variable

String s = "Hello";
String s1 = new String("Hello").intern();

所以这里:

System.out.println(s == s1);

ss1指的是同一个对象。