包装类Integer的equal方法与“==”运算符 比较

包装类Integer的equal方法与“==”运算符 比较

一、在讲述之前先扔出一段代码看看

 public static void main(String[] args)  {
        Integer num1=15;
        Integer num2=15;
        boolean equals = num1.equals(num2);
        boolean b = num1 == num2;
        System.out.println("使用equal方法"+equals);
        System.out.println("使用==运算符"+b);

        Integer num3=128;
        Integer num4=128;
         equals = num3.equals(num4);
         b = num3 == num4;
        System.out.println("使用equal方法"+equals);
        System.out.println("使用==运算符"+b);

        Integer num5=128;
        int num6=new Integer(128);
        equals = num5.equals(num6);
        b = num5 == num6;
        System.out.println("使用equal方法"+equals);
        System.out.println("使用==运算符"+b);
    }

运行结果

小朋友看了这个结果有没有什么疑问?

二、反编译代码

我相信看到这个反编译代码后,就可以懂了个大概
所谓的自动拆箱,自动装箱。就是在编译产生字节码时候编译器为我们添加Integer.valueOf()和intValue()方法

三、先说equal方法

查看Integer源码中equal方法,发现它重写了equal方法,代码如下

public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }

看到源码是否瞬间就理解为什么equal全为true? equal实际底层比较的就是两个int型数字,因为二者数字都是相同的,所有equal一直是true。若一个为2一个为3,那么equal方法所得到的就是false咯!

四、再来说说“==”运算符

1.对于第一个

Integer num1=15;
      Integer num2=15;
      boolean equals = num1.equals(num2);
      boolean b = num1 == num2;
      System.out.println("使用==运算符"+b);

为什么“”运算符的结果为true呢?“”运算符所比较的是二者地址,结果应该为false啊
答:该运算符确实比较的是地址,但结果确实应该是true,我们来看一下源码
根据反编译结果可知:自动装箱调用的是valueOf方法,那我们看一下valueof源码
该方法用到了IntegerCache类,我把该类的源码也放上

根据源码可知,类加载时就把从-128~127的数创建好Integer对象存入cache中,需要的时候直接到cache中去取,所以每次取得的对象同时同一个,所以结果为true也就不足为奇

2.再看第二个比较

Integer num3=128;
        Integer num4=128;
         equals = num3.equals(num4);
         b = num3 == num4;
        System.out.println("使用==运算符"+b);

理解了第一个比较,这个就很好理解了,因为128超过了给定的-128-127范围,所以要new Integer,产生两个对象,所以结果为false

3.最后看第三个比较

 Integer num5=128;
        int num6=new Integer(128);
        equals = num5.equals(num6);
        b = num5 == num6;
        System.out.println("使用==运算符"+b);

从反编译结果可以看出,在比较时num6调用了intvalue方法得到int型数,所以128==128结果当然是true

posted @ 2022-01-05 11:46  三只蛋黄派  阅读(125)  评论(0编辑  收藏  举报