欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-06-28 17:55:36
Integer自动装箱的==和equals结果的探究== : 实行懒惰性,A == B。总的来说,A和B任意一个为数值,就是进行数值比较。当A、B都为对象的时候,比较地址值是否相同。当A、B存在一个为数值时,直接比较数值。当A为对象,B为(Integer + Integer),B触发拆箱,计算完成后,不装箱,使用数值进行比较,变为同2。都为数值,直接比较数值。equals:看下源码 public boolean equals(Object obj) { if (o...

先上结论

== :
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

相关标签: Java 自动装箱