java自动装箱的好处_java基本数据类型的自动装箱、自动拆箱

大家学习java时,一般都是会先去学习java的八种基本数据类型。

他们分别是:byte、short、int、long、float、double、boolean、char。

他们对应的包装类是:Byte、Short、Integer、Long、Float、Double、Boolean、Char。

那我们看看下面这段程序执行的结果会是什么呢。

01演示

2e240dc72f88efa7bcaaca480c27f3be.png

大家觉得结果会是什么呢?

会是下面这样的吗?

a == b 的结果是:true

a == c 的结果是:true

d == e 的结果是:true

b == f 的结果是:true

很遗憾告诉大家上面这个结果是错误的,正确的结果是下面这个:

82f03d09c1cce29390f6da344dcc38a0.png

为什么结果是这样的呢。

02分析

我们来分析一下。

这里就涉及到了java基本数据类型的自动装箱和自动拆箱了。

像上面代码中“Integer b = 5;”这句就会用到自动装箱,会把基本数据类型的int值5自动封装成一个Integer类型的对象。

这里会用到Integer类的“public static Integer valueOf(int i)”方法。我们来看看Integer的这个方法。

cd76b460e6618ad159f1efbe4547bd4f.png

这里的low是-128,high是127。也就是说如果是要对这两个值之间的int值做装箱时,是从缓存中取对应的Integer对象。如果是对不在这个范围的值做装箱时,则是新创建一个Integer对象。

这里就解释了上面代码中的一些执行结果了

a == b 的结果是false,是因为a和b是两个完全不同的对象,而“==”比较的是两个对象的地址,所以这个比较的结果就是false了。

d == e 的结果是false,是因为他们在装箱时,不在使用缓存的范围内,就各自创建了一个信息对象,两个对象的地址是不相同的,所以比较的结果就是false了。

b == f 的结果是true,是因为他们在装箱时,是在使用缓存的范围内,b和f取的是缓存中的同一个对象,所以比较的结果就是true了。

而要分析“a == c 的结果”,就要先说说自动拆箱了。这里要将Integer对象a和基本数据类型int的c进行比较时,就会自动调用Integer类的“public int intValue()”这个方法去将Integer对象拆箱转换成int值。

来看代码。

7de39229c9cbe092e6c89cca71bfb27e.png

a == c 的结果是true,是因为Integer对象a拆箱后的值和c的值一样都是5(基本数据类型比较的是值),所以结果是true。

对Integer的装箱拆箱的分析就到这里。

0f2996068a2dd0138e26de265e27e7c0.png

其他数据类型的包装类里都有对应的valueOf以及**Value(如longValue等等),大家可以自行去探索一下。如果有问题,可以在评论区留言,我会给大家解答。

一本经典的java数据推荐给大家。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值