资讯专栏INFORMATION COLUMN

Java 包装类比较时带来的问题

CloudDeveloper / 3356人阅读

摘要:例输出看包装类源码会发现比较时会先去判断类型是否相同。用包装类的方式比较时,由于包装类并不会自动去转换类型,所以类型不同时即使值相同也会返回。所以在用包装类比较数值时,不要用用方法时要注意类型相同或者直接用基础数据类型比较。

例1:

        Integer a = 1;
        Integer b = 2;
        Integer c = 3;
        Integer d = 3;
        Integer e= 321;
        Integer f= 321;
        Long g = 3L;
        System.out.println(c == d); //1
        System.out.println(e == f); //2
        System.out.println(c == (a+b)); //3 
        System.out.println(c.equals(a+b));//4
        System.out.println(g == (a+b)); //5
        System.out.println(g.equals(a+b)); //6

输出结果

true
false
true
true
true
false

1.包装类比较,不会自动拆包,但是Integer中会有一个cache 存储-128到127的数,所以c与d的地址值相同。
2.地址值比较,没用到cache
3.当 "=="时,右侧发生自动拆包,所以其实是int值在比较
4.a+b 时拆包成int,传入Integer的equals方法进行自动装包。equals方法内是值比较。
5.会拆包成基础数据类型比较
6.包装类的equals 会判断类型,Long.equals(Object object)中判断类型不符合,返回false。

例2:

        Long a = 1L;
        Integer b = 1;
        System.out.println(a.equals(1)); //7
        System.out.println(a.equals(1L));
        System.out.println(a.equals(b));

输出

false
true
false

看包装类源码会发现比较时会先去判断类型是否相同。
7.a.equals(1)时,int 1 装包成Integer,自然和Long不同类型。

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

总结:
当使用自动拆包/装包时,包装类之间比较并不会自动拆包,是地址比较,其中还有缓存会影响结果。
用包装类的equals方式比较时,由于包装类并不会自动去转换类型,所以类型不同时,即使值相同,也会返回false。所以在用包装类比较数值时,不要用"==",用equals方法时要注意类型相同,或者直接用基础数据类型比较。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/70610.html

相关文章

  • 深入浅出 Java包装

    摘要:前阵子,我们分享了中的基本数据类型转换这篇文章,对许多粉丝还是有带来帮助的,今天讲一下包装类的的由来,及自动装箱拆箱的概念和原理。下面是基本数据类型与对应的包装类型。 showImg(https://segmentfault.com/img/remote/1460000016537706); 前阵子,我们分享了《Java中的基本数据类型转换》这篇文章,对许多粉丝还是有带来帮助的,今天讲...

    ytwman 评论0 收藏0
  • java:异常处理

    摘要:异常处理机制异常与异常类的继承体系在程序中,当程序出现意外情况时,系统会自动生成一个来通知程序,从异常发生出逐渐向外传播,如果没有人来处理该异常,就会交给来处理,对异常的处理方法是,打印异常跟踪栈信息,并中止程序的执行。 1 为什么要处理异常? 异常机制可以使程序的异常处理代码与正常业务代码分离,保证程序代码的健壮性。在设计程序的时候,好的程序需要尽可能处理已知的可能产生的错误,但是事...

    LuDongWei 评论0 收藏0
  • int和Integer深入分析

    摘要:对象头的另外一部分是类型指针,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。并不是所有的虚拟机实现都必须在对象数据上保留类型指针,换句话说,查找对象的元数据信息并不一定要经过对象本身,这点将在节讨论。 目录介绍 1.关于int和Integer的问题区别分析 2.Integer的值缓存的原理 2.1 Java 5 中引入缓存特性 2.2 Intege...

    Half 评论0 收藏0
  • Java 集合 Set

    摘要:当复制集合中的所有元素来创建新的集合时,要求集合中的所有元素必须是同一个枚举类的枚举值各实现类的性能分析的性能总比好,特别是最常用的添加查询元素等操作。因为需要额外的红黑树算法来维护集合元素的次序。在创建时进行,以防对集合的意外非同步访问 HashSet 大多时候使用Set集合时就是使用HashSet实现类。HashSet按Hash算法来存储集合中的元素,因此具有很好的存取和查找性能 ...

    verano 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<