Java 装箱和拆箱 128陷阱问题

9 篇文章 0 订阅

装箱与拆箱

概念

装箱:在程序设计中,值类型实例到对象的转换,它暗示在运行时实例将携带完整的类型信息,并在堆中分配。
拆箱:拆箱是将引用类型转换为值类型,利用装箱和拆箱功能,可通过允许值类型的任何值与Object 类型的值相互转换,将值类型与引用类型链接起来。
(概念有点晦涩,但是用起来就很简单了。)

小例子

Integer number=100;//100是int类型,number是Integer对象,此为自动装箱。

int i=number;//i为int类型,number为Integer对象,此为自动拆箱;

看了上面的例子是不是已经对装箱、拆箱心理有底了?

Java中需要装箱拆箱的类型

基本类型 | 包装器类型
byte | Byte
short | Short
int | Integer
long | Long
float | Float
double | Double
bool | Boolean
char | Character

128陷阱

很简单的一个小例子

Integer n1=100;
Integer n2=100;
Integer n3=200;
Integer n4=200;
System.out.print(n1==n2);
System.out.print(n3==n4);

在上面的例子中最终打印出以下:

true
false

为什么?
因为Integer包装器在自动装箱过程中将数据小于128和大于127时会创建另一个Integer对象,并将其值复制进去,所以n3=n4这个判断其实是两个对象引用的判断,故而返回false
但是!在Double包装器自动装箱时每次都会创建一个Double对象
我们可以将他们分成Integer类和Double类:
Integer类:Byte、Short、Integer、Long、Character;
Double类:Float、Double;
因为Boolean只有两种情况,所以它是一个十分特立独行的仔

额外小记:拆箱时的空指针错误

Integer i1=null;
int=i1;

这段代码可以通过编译但是运行时会有空指针错误,因为包装器类在自动拆箱时会调用inValue();方法,当参数为null,当然会报错啦!

以上














现在熬夜是为了以后不熬夜 Fighting!
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值