我当时在做整数的Java ArrayList。但是,我发现在某些负int值之后,<Integer>类型集合开始与==操作符发生异常行为。
请参阅以下代码:
import java.util.*;
public class JavaWeirdness
{
public static void main(String[] args)
{
for(int i=0;i>=-200;i--)
{
ArrayList<Integer> list = new ArrayList<>();
list.add(i);
list.add(i);
System.out.println("For i = "+ i);
System.out.println((list.get(0) == list.get(1)));
}
}
}然后,当i <= -129为每个值打印false时。
这使我感到困惑,是因为Refrence Type Integer而不是primitive int
就好像我们改变了:
list.get(0) == list.get(1);至:
(int) list.get(0) == (int) list.get(1));一切都好起来了。
或
即使我们使用.equals()而不是==,它也可以正常工作。
像这样:
list.get(0).equals(list.get(1));但
我的问题是:为什么?是在第一位发生的吗?
是因为auto-boxing和unboxing
或
是因为buffer问题吗?如果你仔细观察,它是-((2^7)+1)和继续。
或
是因为收藏问题吗?
或
是虫子吗?(我不认为情况会这样)
或
是因为IEEE的一些数字标准吗?
或
还要别的吗?
这有点奇怪,不过,我希望这里的专家能帮我一把。
PS。请不要问我为什么写了这个奇怪的代码(假设我只是在测试一些东西:P :D)
发布于 2020-02-16 10:00:00
对象上的==引用相同实例的相等。在原语int上,它引用相同的值等于是比较Integer,或Long或String或其他基于值的正确的chiice。收藏不成问题
https://stackoverflow.com/questions/60247312
复制相似问题