是什么导致List.get(128)不同

时间:2014-04-15 02:16:19

标签: java list

        int a= p1.get(128);
        int b = p2.get(128);
        if(a == b)  System.out.println("same");   

        if(p1.get(128) == p2.get(128)) System.out.println("same");  

说我有两个列表a和b哪个元素是1,2,3 ...完全相同, 对于上面的代码,我感到不可思议的是,如果(p1.get(128)== p2.get(128))错误,而上述情况为真,为什么?

似乎127是一个门槛,为什么?

3 个答案:

答案 0 :(得分:4)

p1p2是两个不同的对象,因此当您将它们与==进行比较时,结果为false。

ab是基元,并通过自动拆箱获取值。因为它们获得相同的整数值,因此a&使用b进行==比较会产生真正的

答案 1 :(得分:1)

原因是:

p1.get(128)返回Integer个对象,而p2.get(128)返回另一个Integer个对象。这些对象具有相同的值,但它们不是同一个对象

因此,

p1.get(128) == p2.get(128);    // is false

但是,

p1.get(128).equals(p2.get(128)); // is true

答案 2 :(得分:1)

java.lang.Integer保留对象的内部缓存,其值为-128到127.因此,当您将该范围内java.lang.Integer的自动装箱实例与参考比较进行比较时,它将匹配。

这第一个表达式是正确的,因为这两个对象来自缓存并且是相同的引用:

Integer a = 127; Integer b = 127; a == b

相当于:

(Integer.valueOf(127) == Integer.valueOf(127))

下一个比较是假的,因为它超出了缓存的范围,因此每次调用valueOf()都会产生一个新对象而指针不匹配

(Integer.valueOf(128) == Integer.valueOf(128))

如果实际上相当于

new Integer(128) == new Integer(128)