int i=0; Integer j = new Integer(0); System.out.println(i==j); System.out.println(j.equals(i));
int a=257;因此上面的代码的结果因此为 true, false, false, true
Integer b=257;
Integer c=257;
Integer b2=57;
Integer c2=57;
System.out.println(a==b);
//System.out.println(a.equals(b)); 编译出错,基本型不能调用equals()
System.out.println(b.equals(257.0));
System.out.println(b==c);
System.out.println(b2==c2);
i==j ,这个是基本类型与 Integer 的比较, j 会自动拆箱成 int 类型,然后比较的是值。因此返回真。
j.equals(i) ,调用 equals 方法后,这个 i 会自动装箱成 Integer 类型,然后再比较值,所以也返回真。
一。首先说结论:
(1)int与Integer、new Integer()比较时,结果永远为true
(2)Integer与new Integer()比较时,结果永远为false
(3)Integer与Integer比较时,看范围;在大于等于-128小于等于127的范围内为true,在此范围外为false。
下面是解析过程:
1.Integer与int比较时,Integer会有拆箱的过程,我们可以看看拆箱的代码:
直接返回的就是value,因此int与Integer以及new Integer()进行 ==比较时结果都是true。
2.Integer a=n时,如果n大于等于-128小于等于127时,会直接从IntegerCache中取,不在这个范围内,会new一个对象,所以Integer与new Integer进行 ==比较时,结果都是false。
Integer是包装类型,比较使用equals(),Integer覆写了equals()方法,equals比较先看类型,若类型相同再看值;
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
public static Integer valueOf(int i) { if(i >= -128 && i <= IntegerCache.high) // 没有设置的话,IngegerCache.high 默认是127 return IntegerCache.***[i + 128]; else return new Integer(i); }