美文网首页
java中包装类型比较问题

java中包装类型比较问题

作者: SteveLaw1124 | 来源:发表于2020-03-09 12:05 被阅读0次

    1.在java中基础数据类型int,long,float,double...等等对应的包装类为Integer,Long,Float,Double...

    在对数据进行比较的时候如

    int a = 1000;int b=1000;
    
    if( a == b){
        return true
    }else{
        return false
    }
    

    我们都知道程序运行的结果是true;

    2.但是包装类情况就不一样了

    先来一段代码,直接上图
    我们拿Integer做示范


    代码片段1

    可以看到a1和a2同样是100 比较两个值时得到了正确的结果,但是b1和b2的值虽然都相同但是比较的结果时false

    为什么会出现这种情况呢?

    我们先要明白一件事,包装类的对象是对象,对象用==比较的是对象的地址

    Integer b1 = 1000; 其实b1 是一个对象,是java自动把1000包装成Integer对象(new Integer(1000))并赋值给b1
    同理b2也是一个对象,此时使用==,那么比较的是b1和b2的对象地址,当然为false啦;

    那么为什么100又能使用==比较呢?

    原来包装类型Integer在内部会对较小的数值进行缓存(-128 ~ 127),然后其他的Integer对象若是拿-128 ~ 127的值是直接从缓存拿的,我摘取一段Integer类的源码


    integer内部源码1
    integer内部源码2

    很明显此时的a1 和 a2都是IntegerCache中的同一个缓存,所以可以直接用==比较

    3.如何正确使用方式

    其实也很简单
    我们可以使用Integer类的intValue()获取值后进行比较
    b1.intValue() == b2.intValue()


    integer内部源码3 integer内部源码4

    或者使用equals()方法,Integer对equals进行了重写,源码是这样的


    integer内部源码5

    b1.equals(b2);

    相关文章

      网友评论

          本文标题:java中包装类型比较问题

          本文链接:https://www.haomeiwen.com/subject/klbudhtx.html