java自动包装与解包

发布时间:2019-05-04 14:00:01发布者:Mr.Zhang阅读(337)

关于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