可以任何机构向我解释输出中发生的事情。 如果==用于比较两个ref。变量它只是检查它的引用是否相同然后它输入if body,那么为什么地狱 aa == bb是否等于如果使用new关键字创建其对象时,creting静态方法valueOf()和ee == ff不相等(这没关系)?
static void main(String args[])
{
Integer aa = Integer.valueOf("12");
Integer bb = Integer.valueOf("12");
if(aa==bb)System.out.println("aa==bb");
if(aa!=bb)System.out.println("aa!=bb");
Integer ee = new Integer("12");
Integer ff = new Integer("12");
if(ee==ff)System.out.println("ee==ff");
if(ee!=ff)System.out.println("ee!=ff");
}
输出:
AA BB ==
EE!= FF
答案 0 :(得分:11)
==
比较器检查对象是否相等!
由于Integer.valueOf
维护整数对象的缓存,其值为-128到127 valueOf(String)
,因此返回缓存的对象,因此==
比较结果为true。
Integer a1 = new Integer("12");
Integer b1 = new Integer("12");
//a1 == b1 returns false because they point to two different Integer objects
Integer aa = Integer.valueOf("12");
Integer bb = Integer.valueOf("12");
//aa == bb returns true because they point to same cached object
对于对象值的比较,总是使用.equals
方法,对于int,long等原语,你可以使用==
比较器。
答案 1 :(得分:3)
因为Integer.valueOf
维护从-128
到127
的整数缓存
以下是valueOf
的源代码,如果整数值介于-128
到127
public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}
所以你的==
返回true。如果值大于该值,那么它将始终返回false。
Integer aa = Integer.valueOf("1200");
Integer bb = Integer.valueOf("1200");
aa == bb --> false
您应该始终使用equals方法
检查相等性ee.equals(ff);
如果您使用以下
添加另一个 if (ee.equals(ff))
System.out.println("ee equals ff");
输出
ee equals ff
答案 2 :(得分:1)
对于ee和ff,在堆上创建了Integer
的两个对象,因此它们都引用了不同的对象,因此在使用==
运算符时它们不相等。
答案 3 :(得分:1)
new Integer("12")
创建一个值为12的新Integer对象。无论您多久这样做,您每次都要创建一个全新的对象。这就是==
在第二种情况下不起作用的原因。
JVM维护Integer对象的缓存,以获取被认为更频繁使用的值(-128-127)。场景后面的Integer.valueOf("12")
执行相同的操作(new Integer("12")
),但在执行此操作之前,它会检查该缓存中是否该对象已存在于缓存中,如果确实存在则返回该内容,否则它会创建一个新的,将其添加到缓存并返回它。这就是==
在第一种情况下起作用的原因。
此外,对于对象,==
永远不应该用于相等性检查,而应该仅用于身份检查(例如,查看两个不同的变量是否指向同一个对象)。对于等式检查,请始终使用equals
方法。