我想比较两个Integer类型数组的值。当我比较它们的确切值时,我得到错误的答案,当我将它们与Arrays.equals进行比较时得到正确答案:
Integer a[]=new Integer[2];
Integer b[]=new Integer[2];
a[0]=138;
a[1]=0;
b[0]=138;
b[1]=0;
boolean c;
c=a[0]==b[0];//c is false
c=Integer.valueOf(a[0])==Integer.valueOf(b[0]);//c is false
c=Arrays.equals(a, b);//c is true
答案 0 :(得分:5)
你正在寻找intValue
,而不是Integer.valueOf
(虽然很容易看出你如何让他们感到困惑!):
c = a[0].intValue() == b[0].intValue();
Java具有基本类型(int
,byte
,double
等),并且还针对需要对象的情况引用与它们对应的类型(对象)。执行a[0] = 138;
的代码会在Integer
实例中自动装箱原始值138。
intValue
返回int
实例包含的原语Integer
。 Integer.valueOf
用于获取Integer
个实例(来自int
或String
- 在您的情况下,它会自动使用valueOf(int)
装箱Integer
参考号。)
你也可以这样做:
c = (int)a[0] == (int)b[0];
...会触发自动拆箱。
有关拳击(包括自动装箱和取消装箱)的更多信息,请参见the specification。
答案 1 :(得分:2)
您正在代码中进行隐式类型转换(自动装箱)。
该行:
a[0]=138;
实际上翻译为:
a[0] = Integer.valueOf(138);
创建Integer实例。问题是这个方法将整数从0缓存到127并为高于127的值创建新实例,因此== compare返回false。
请注意,[0]的实际类型是整数,因此您可以编写
c=a[0].equals(b[0]);
将返回true。
答案 2 :(得分:0)
由于数组,我认为内部值不会自动取消装箱。如果你有一个int[]
而不是Integer[]