java自动包装与解包

2019-05-04 09:40:09来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

关于java的自动包装机制想必大家都用过吧,一般这些机制都用于在往容器中存储基本类型数据的时候,因为容器中不允许存在基本数据类型,所以就会调用自动包装机制,将基本数据类型转换为对象,将基本数据保存在对象中,并且提供一些基本方法,但是自动包装机制存在一些陷阱,使用不当就会出错

先看看下面一个例子吧

 1 package test;
 2 
 3 public class AutoPack {
 4     public static void main(String[] args) {
 5         Integer a=1;
 6         Integer b=2;
 7         Integer c=3;
 8         Integer d = 3;
 9         Integer e=321;
10         Integer f=321;
11         Long g=3L;
12         System.out.println(c==d);//true
13         System.out.println(e==f);//false
14         System.out.println(c==(a+b));//true
15         System.out.println(c.equals(a+b));//true
16         System.out.println(g==(a+b));//true
17         System.out.println(g.equals(a+b));//false  //不是同一类型
18         System.out.println(g.equals((long)(a+b)));//true   首先比较是不是同一类型,再比较值
19     }
20 }

上面例子中的输出你都做对了吗?如果有疑惑,请看我下面的解答

首先我们得请出一个前提:对于对象类型,==符号表示比较对象的所在的物理地址,equals方法比较的是对象的值(前提是两者属于同一个对象类型),而对于基本数据类型,==符号比较的是值

那么对于第一个输出,可能就有点疑惑了,为什么明明是比较对象的地址,却输出了true,而不是false,这里又有一点要补充啦!

因为在jdk实现的时候,考虑到一些对象可能会经常使用,所以在内部创建了一个数组,将常用对象提前做好了创建(Integer是-127~128),要使用的时候,返回的其实是同一个对象,而对于超出范围的值,就会创建一个新的对象啦!

再来看第五个输出,返回了true,这里其实是自动拆包,在包装类的==符号遇到算术运算的时候,就会发生自动拆包,所以比较的是两者的值

那么下面来总结一下:

1.在==运算的时候,如果两端中任何一端含有算术表达式,就会发生自动解包,这时比较的是值

2.在==运算时,两端都没有算术表达式,就不会解包,这时比较的是对象的地址(这样使用很危险)

3.equals可以比较对象的值,比较推荐使用,但前提是要相同对象类型,比如在上面倒数第二个输出中,虽然值相等,但是一个是Integer,一个是Long,就会返回false,但是如果是基本数据类型int 和 long ,他们其实是可以相等的


原文链接:https://www.cnblogs.com/by-my-blog/p/10808057.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:HttpServletRequest对象,自己学习的心得。

下一篇:调用链监控 CAT 之 入门