我正在使用Java ArrayList。为什么从ArrayList得到的值相同?
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(-129);
list.add(-129);
return (list.get(0) == list.get(1));
返回值是假的。 我知道它一定是一些范围问题,因为当我使用-128时,它返回true。 但有人能告诉我它的原因吗?
我正在使用Java ArrayList。为什么从ArrayList得到的值相同?
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(-129);
list.add(-129);
return (list.get(0) == list.get(1));
返回值是假的。 我知道它一定是一些范围问题,因为当我使用-128时,它返回true。 但有人能告诉我它的原因吗?
Java caches integers的范围是-128..127(带符号字节)。它可以节省大量代码中很常见的小数字的分配。如果您使用equals()
而不是==
,它将起作用。 ==
检查是比较那两个int
类型,已魔术盒(即转换)Integer
是相同的参考 - 他们不是。但是在有符号的字节范围内的int
将是相同的。该equals
检查实际上会比较值的变量:
return (list.get(0).equals(list.get(1)));
这是正确的答案。 – Keith
非常感谢!!!! –
如果两个引用指向两个不同的对象,然后按照“==”来判断两者是不相等的,即使两者有相同的参考内容。如我们所知,如果两个引用指向同一个对象,按照“= =”来判断这两个是相等的。
如果你去整数。 Java类,你会发现有一个内部的私有类IntegerCache。 Java,它从所有Integer对象缓存 - 128〜127之间。
所以,事情是,所有的小整数都在内部缓存中。 如果该值在128〜127之间,那么它将从缓存实例返回,指向同一个对象。
当您执行以下操作时: list.add(-129); list.add(-129);
它创建两个单独的对象与单独的内存位置。当您执行==它返回false。 在Java中,从-128到127的值被高速缓存,所以返回相同的对象,您将会成为true。
欲了解更多信息,请参阅:http://www.geeksforgeeks.org/comparison-autoboxed-integer-objects-java/
你检查引用相等。改用'.equals()'。 -128工作,因为它在缓存值的范围内。 – shmosel
如果是这样,为什么-128是真的? –
整数缓存 - 看看我的答案。 –