2017-02-23 45 views
0

我正在使用Java ArrayList。为什么从ArrayList得到的值相同?

ArrayList<Integer> list = new ArrayList<Integer>(); 
list.add(-129); 
list.add(-129); 
return (list.get(0) == list.get(1)); 

返回值是假的。 我知道它一定是一些范围问题,因为当我使用-128时,它返回true。 但有人能告诉我它的原因吗?

+1

你检查引用相等。改用'.equals()'。 -128工作,因为它在缓存值的范围内。 – shmosel

+0

如果是这样,为什么-128是真的? –

+0

整数缓存 - 看看我的答案。 –

回答

1

Java caches integers的范围是-128..127(带符号字节)。它可以节省大量代码中很常见的小数字的分配。如果您使用equals()而不是==,它将起作用。 ==检查是比较那两个int类型,已魔术盒(即转换)Integer是相同的参考 - 他们不是。但是在有符号的字节范围内的int将是相同的。该equals检查实际上会比较值的变量

return (list.get(0).equals(list.get(1))); 
+0

这是正确的答案。 – Keith

+0

非常感谢!!!! –

-1

如果两个引用指向两个不同的对象,然后按照“==”来判断两者是不相等的,即使两者有相同的参考内容。如我们所知,如果两个引用指向同一个对象,按照“= =”来判断这两个是相等的。

如果你去整数。 Java类,你会发现有一个内部的私有类IntegerCache。 Java,它从所有Integer对象缓存 - 128〜127之间。

所以,事情是,所有的小整数都在内部缓存中。 如果该值在128〜127之间,那么它将从缓存实例返回,指向同一个对象。

0

当您执行以下操作时: list.add(-129); list.add(-129);

它创建两个单独的对象与单独的内存位置。当您执行==它返回false。 在Java中,从-128到127的值被高速缓存,所以返回相同的对象,您将会成为true。

欲了解更多信息,请参阅:http://www.geeksforgeeks.org/comparison-autoboxed-integer-objects-java/

相关问题