java中什么是自动拆装箱,Java自动拆箱
一、什么是装箱,什么是拆箱
装箱:将基本数据类型转换成包装类。
解包:将打包类转换为基本数据类型。
基本数据类型对应的打包类:
Int(几个字节4)-整数
字节(1)-字节
短(2)-短
long(8)- Long
浮动(4)-浮动
双(8)-双
char(2)-字符
布尔型(未定义)-布尔型
免费在线视频学习教程推荐:java视频教程
二、先来看看手动装箱和手动拆箱
举例:以int和Integer为例。
integer i1=integer . value of(3);
int I2=i1 . int value();手动装箱由valueOf完成。大家都知道=右边的值赋给左边,3是int类型。赋值给左边成为一个整数包装类。
手动解包是通过intValue()完成的,从代码中可以看出i1已经从整数变成了int。
三、手动看完了,来看自动的
为了减少技术人员的工作,java从jdk1.5换成了自动打包解包。以上面的例子为例:
手动:
integer i1=integer . value of(3);
int I2=i1 . int value();自动的
整数i1=3;
int i2=i1默认情况下,这已经自动安装和拆卸。
四、从几道题目中加深对自动装箱和拆箱的理解
(1)
整数a=100
int b=100
system . out . println(a==b);结果是真的。原因:A会自动解包和B比较,所以是真的。
(2)
整数a=100
整数b=100
system . out . println(a==b);//结果为真
整数a=200
整数b=200
system . out . println(a==b);//结果是假的。这里有个有趣的事情。为什么两个变量相同,只有一个值不同的为真,另一个为假?
原因:在这种情况下,我们要讲比较符号==,比较的内存地址,也就是新对象的内存地址。看到这里你可能会问,看似没有新的,其实整数a=200200前面默认是new Integer,使用的内存地址不同==比较为假,但是为什么100为真?这是因为java中的常量池。我们可以点击Integer的源代码来看看。
私有静态类IntegerCache {
静态最终int low=-128;
静态最终int高;
静态最终整数缓存[];
静态{
//高值可以由属性配置
int h=127
字符串integerCacheHighPropValue=
sun . misc . VM . getsavedproperty( Java . lang . integer . integer cache . high );
if (integerCacheHighPropValue!=null) {
尝试{
int I=parse int(integerCacheHighPropValue);
i=Math.max(i,127);
//最大数组大小是整数。最大值
h=Math.min(i,整数。MAX _ VALUE-(-低)-1);
} catch(NumberFormatException nfe){
//如果该属性无法解析为int,则忽略它。
}
}
高=h;
cache=新整数[(高-低)1];
int j=低电平;
for(int k=0;k cache.lengthk)
cache[k]=新整数(j);
//必须保留范围[-128,127](jls 7 5 . 1 . 7)
断言IntegerCache.high=127
}在-128和127之间比较时,对象不会是新的,而是直接从常量池中获取,所以100为真,200超过这个范围再进行新的操作,所以内存地址不同。
(3)
整数a=新整数(100);
整数b=100
system . out . println(a==b);
//结果是假的。这个和上面那个100差不多。从常量池中取出。为什么是假的?
原因:因为新的整数(100),虽然100可以在常量池中取,但是经不起你直接给new一个对象。使用的两个内存地址是不同的。
(4)
整数a=100
整数b=100
system . out . println(a==b);
//结果为真
a=200
b=200
system . out . println(c==d);
//结果是假的。原因:=号右边的值赋给了左边的A,B已经是包装类,200不在常量池中。int type 200赋给wrapper类,自动打包的结果为false,因为不在常量池中,所以对象默认为new。
更多文章和教程,请访问:java语言入门。以上是对java中自动打包和解包的详细了解。请多关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。