深入理解 java 中的自动装箱与拆箱
、什么是装箱,什么是拆箱
装箱:把基本数据类型转换为包装类。
拆箱:把包装类转换为基本数据类型。
基本数据类型所对应的包装类:
int(几个字节 4)- Integer
byte(1)- Byte
short(2)- Short
long(8)- Long
float(4)- Float
double(8)- Double
char(2)- Character
boolean(未定义)- Boolean
免费在线视频学习教程推荐:java 视频教程
二、先来看看手动装箱和手动拆箱
例子:拿 int 和 Integer 举例
Integer i1=Integer.valueOf(3);int i2=i1.intValue();手动装箱是通过 valueOf 完成的,大家都知道 = 右边值赋给左边,3 是一个 int 类型的,赋给左边就变成了 Integer 包装类。
手动拆箱是通过 intValue()完成的,通过代码可以看到 i1 从 Integer 变成了 int
三、手动看完了,来看自动的
为了减轻技术人员的工作,java 从 jdk1.5 之后变为了自动装箱与拆箱,还拿上面那个举例:
手动:
Integer i1=Integer.valueOf(3);int i2=i1.intValue();自动
Integer i1=3;int i2=i1;这是已经默认自动装好和拆好了。
四、从几道题目中加深对自动装箱和拆箱的理解
(1)
Integer a = 100;int b = 100;System.out.println(a==b);结果为 true 原因:a 会自动拆箱和 b 进行比较,所以为 true
(2)
Integer a = 100;Integer b = 100;System.out.println(a==b);//结果为 trueInteger a = 200;Integer b = 200;System.out.println(a==b);//结果为 false 这就发生一个有意思的事了,为什么两个变量一样的,只有值不一样的一个是 true,一个是 false。
原因:这种情况就要说一下 == 这个比较符号了,== 比较的内存地址,也就是 new 出来的对象的内存地址,看到这你们可能会问这好像没有 new 啊,但其实 Integer a=200; 200 前面是默认有 new Integer 的,所用内存地址不一样 == 比较的就是 false 了,但 100 为什么是 true 呢?这是因为 java 中的常量池 我们可以点开 Integer 的源码看看。
private static class IntegerCache {static final int low = -128;static final int high;static final Integer cache[];
在对 -128 到 127 之间的进行比较时,不会 new 对象,而是直接到常量池中获取,所以 100 是 true,200 超过了这个范围然后进行了 new 的操作,所以内存地址是不同的。
(3)
Integer a = new Integer(100);Integer b = 100;System.out.println(a==b);//结果为 false 这跟上面那个 100 的差不多啊,从常量池中拿,为什么是 false 呢?
原因:new Integer(100)的原因,100 虽然可以在常量池中拿,但架不住你直接给 new 了一个对象啊,所用这俩内存地址是不同的。
(4)
Integer a = 100;Integer b= 100;System.out.println(a == b);//结果 truea = 200;b = 200;System.out.println(c == d);//结果为 false 原因:= 号 右边值赋给左边 a,b 已经是包装类了,200 不在常量池中,把 int 类型 200 赋给包装类,自动装箱又因为不在常量池中所以默认 new 了对象,所以结果为 false。
版权声明: 本文为 InfoQ 作者【乌龟哥哥】的原创文章。
原文链接:【http://xie.infoq.cn/article/e0916721296accda48c698b58】。文章转载请联系作者。
评论