Integer自动装箱的==和equals结果的探究

2022-07-28,,,

先上结论

== :
A == B。总的来说,A和B任意一个为数值,就是进行数值比较,否则进行对象地址的比较。

  1. 当A、B都为对象的时候,比较地址值是否相同。
  2. 当A、B存在一个为数值时,直接比较数值。
  3. 当A为对象,B为(Integer + Integer),B触发拆箱,计算完成后,不装箱,使用数值进行比较,变为同2。
  4. 都为数值,直接比较数值。

equals:
看下源码

    public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }
  1. 会对进来的数值进行自动装箱,转换为Object传进来,再判断是否是Integer的同类或子类,不是就返回false,是就接着转换成Integer取出值进行的比较。

看个实例,运行结果的解答需要综合运用上述内容。

public class Main {
    public static void main(String[] args) {
        Integer a = 1;
        Integer b = 1;
        Integer c = new Integer(1);
        Integer d = new Integer(2);
        Integer e = new Integer(2);
        Long f = 3L;
        Long g = 1L;
        int h = 1;

        System.out.println(a == b);//1. true
        System.out.println(a == c);//2. false
        System.out.println(d == e);//3. false
        System.out.println(h == a);//4. true

        System.out.println(a == (d - c));//5. true
        System.out.println(a.equals(d - c));//6. true

        System.out.println(a.equals(f - d));//7. false
        System.out.println(g.equals(f - d));//8. true

        System.out.println(g == (d - c));//9. true
    }
}

解析

System.out.println(a == b);//1. true

Integer会对-128~127进行缓存,自动装箱直接从缓存中取出来,也就是a、b句柄指向的是同一个对象。所以地址值是相同,返回true。

System.out.println(a == c);//2. false

c是new出来的,并非自动装箱从缓存中取出,不是一个对象,返回false。

System.out.println(d == e);//3. false

d和e都是新new出来的,不是同一个对象,返回false。

System.out.println(h == a);//4. true

数值参与==比较,直接比较值,1 == 1 返回true。

System.out.println(a == (d - c));//5. true

d - c 触发拆箱,拆箱后的运算的数值参与比较,所以直接比较数值,1 == 1 返回true。

System.out.println(a.equals(d - c));//6. true

d - c 触发拆箱,拆箱后的运算的数值参与比较,接着发现是Integer的equals方法,开始装箱,d - c为int,转化为Integer,传入equals方法,判断是Integer同类,接着取出数值,发现1 == 1,返回true。

System.out.println(a.equals(f - d));//7. false

f - d 触发拆箱,拆箱后的运算的数值参与比较,接着发现是Integer的equals方法,开始装箱,由于 f 为long类型,所以d - c 向上转为long类型,接着装箱转化为Long,传入equals方法,判断是不是Integer的同类或子类,返回false。

System.out.println(g.equals(f - d));//8. true

f - d 触发拆箱,拆箱后的运算的数值参与比较,接着发现是Long的equals方法,开始装箱,由于 f 为long类型,所以d - c 向上转为long类型,接着装箱转化为Long,传入equals方法,判断是Long的同类,接着取出数值,发现1 == 1,返回true。

System.out.println(g == (d - c));//9. true

d - c 触发拆箱,拆箱后的运算的数值参与比较,1 == 1,返回true。

本文地址:https://blog.csdn.net/qq_36746928/article/details/109579914

《Integer自动装箱的==和equals结果的探究.doc》

下载本文的Word格式文档,以方便收藏与打印。