基础能力——Integer和Int的相等判断
Integer的装箱,拆箱及缓存机制:(54条消息) Integer 的缓存机制_MrYuTing的博客-CSDN博客
当我们了解Integer装拆箱及缓存机制后,再来观察Integer和Int的相等判断
一、Integer 和 Integer对比
- == 比较的对象(地址)是否相等
- equals 比较的是值是否相等
说明:
- Integer重写了equals方法,用于比较两个Integer对象的value值是否相等;如果没有重写equals方法的话,equals比较的也是对象地址是否相等(与==相同)。
- 在对比的两个Integer对象中,如果有对象是new出的,那么用 == 判断一定不相等
- 如果对比的两个Integer对象都不是new出的,且值范围在[-128 ~ 127]之间,判由于Integer的缓存机制,两个对象先装箱,指向同一个缓存对象,此时==方法会返回true,equals也返回true;如果值范围不在[-128 ~ 127]之间,将会直接 new Integer();进行新创建一个对象, == 方法会返回false,而equals方法会返回true;
总结:Integer对象的相等判断推荐使用 equals方法
二、Integer 和 Int 对比
Integer引用和int对比,和两个 int 判断是否相等是一样的,因为在编译期间编译器会把其中的一个 Integer 自动拆箱(Java 1.5 以后)给转换成一个 int,所以在字节码层面仍然是两个int做比较。
如果是1个Integer和1个int,==和equals是一样的,因为Integer会有一个拆箱的过程。只要这两个值一样,不管是==还是equals都是相等的。
下面是验证代码:
public class Test {
public static void main(String[] args) {
// 2个Integer
Integer i1 = new Integer(12);
Integer i2 = new Integer(12);
System.out.println("i1 == i2 ? " + (i1 == i2)); // false
System.out.println("i1.equals(i2) ? " + i1.equals(i2)); //true
// 1个Integer 1个int
Integer i3 = new Integer(13);
int i4 = 13;
System.out.println("i3 == i4 ? " + (i3 == i4)); // true
System.out.println("i3.equals(i4) ? " + i3.equals(i4)); //true
}
}
为什么Integer的equals是判断的值呢?在Integer.class中可以看到Integer类改写了equals方法,就是判断的值是否存在。代码如下:
/**
* Compares this object to the specified object. The result is
* {@code true} if and only if the argument is not
* {@code null} and is an {@code Integer} object that
* contains the same {@code int} value as this object.
*
* @param obj the object to compare with.
* @return {@code true} if the objects are the same;
* {@code false} otherwise.
*/
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
注意:Object中的equals方法就是判断的==,所以如果一个对象没有重写equals方法,那么equals和==的结果是一样的。下面是Object中equals的代码:
public boolean equals(Object obj) {
return (this == obj);
}
补充:Integer 与 Integer的对比
Integer t1 = new Integer(1000);
Integer t2 = new Integer(1000);
System.out.println(t1<=t2);
==结果为false但是t1<=t2结果为true
原因:因为>、<、<=、>=是作用在基本类型上的,而不是对象类型。所以使用>、<、<=、>=的时候,Integer会自动拆箱成int,然后进行值的对比。但是==就是比较的是对象的地址,是说这2个对象在内存中是否占用同一个内存地址。