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是一个门槛,为什么?
答案 0 :(得分:4)
p1
和p2
是两个不同的对象,因此当您将它们与==
进行比较时,结果为false。
但a
和b
是基元,并通过自动拆箱获取值。因为它们获得相同的整数值,因此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)