码匪周子

 

JAVA中包装类的比较

前言:本文主要给大家分享关于Java包装类在比较时遇到的一些问题的解决方法,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

例:Integer a = 1;

  Integer b = 1;

  Integer c = new Integer(1);

  Integer d = new Integer(1);

  Long l = 1L;

  Integer f = 128;

  Integer g = 128;

        System.out.println(a == b); //1. 但是这里会提示建议,建议用equals();
        System.out.println(a.equals(b));//2.
        System.out.println(a==c);//3.
        System.out.println(c==d);//4.
        System.out.println(c.equals(d));//5.
        System.out.println(a == l);//6.
        System.out.println(a.equals(l));//7. 

  System.out.println(f==g);//8. 

输出结果:

true
true
false
false
true

// 6:这里会报出错误,因为两个不是一个类型,
false

false

1.包装类比较,不会自动拆包,但是Integer中会有一个cache 存储-128到127的数,所以f与g的地址值不相同。

2.地址值比较,没用到cache

3.当 '=='时,右侧发生自动拆包,所以其实是int值在比较

4.a+b 时拆包成int,传入Integer的equals方法进行自动装包。equals方法内是值比较。

5.会拆包成基础数据类型比较

6.包装类的equals 会判断类型,Long.equals(Object object)中判断类型不符合,返回false。

 

总结:

当使用自动拆包/装包时,包装类之间比较并不会自动拆包,是地址比较,其中还有缓存会影响结果。

用包装类的equals方式比较时,由于包装类并不会自动去转换类型,所以类型不同时,即使值相同,也会返回false。所以在用包装类比较数值时,不要用'==',用equals方法时要注意类型相同,或者直接用基础数据类型比较。

 

posted on 2021-12-23 16:00  码匪周子  阅读(431)  评论(0编辑  收藏  举报

导航