Home 基础能力 基础能力——Integer和Int的相等判断

基础能力——Integer和Int的相等判断

0 169

Integer的装箱,拆箱及缓存机制:(54条消息) Integer 的缓存机制_MrYuTing的博客-CSDN博客

当我们了解Integer装拆箱及缓存机制后,再来观察Integer和Int的相等判断

一、Integer 和 Integer对比

  • == 比较的对象(地址)是否相等
  • equals 比较的是值是否相等

说明:

  1. Integer重写了equals方法,用于比较两个Integer对象的value值是否相等;如果没有重写equals方法的话,equals比较的也是对象地址是否相等(与==相同)。
  2. 在对比的两个Integer对象中,如果有对象是new出的,那么用 == 判断一定不相等
  3. 如果对比的两个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个对象在内存中是否占用同一个内存地址。

SIMILAR ARTICLES

发表评论

发表评论