zoukankan      html  css  js  c++  java
  • 包装类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

    生活虽然苦闷,但跑起来总是带风!
  • 相关阅读:
    记录Windows下文件操作记录
    线程太多导致socket连接池爆满,进程启动不了
    【转载】windbg 常用命令详解
    比较两个CSV的方法的探索
    【转载】java.util.ServiceConfigurationError: com.sun.tools.attach.spi.AttachProvider
    [转载]sql server死锁
    moco搭建json api网站用于接口测试
    Httprequest 获取url 常用方法
    test文件伪装
    微信小程序开发历程
  • 原文地址:https://www.cnblogs.com/threeAgePie/p/15766211.html
Copyright © 2011-2022 走看看