java自动装箱|拆箱解密

首先我们来认识一下装箱,在我们平时代码里随处可见,只是你没有留意到罢了(准确来说是JDK没让你注意到),对于代码片段:
Double d = 12d;

来说,这是我们写的java代码,还没有进行过编译,在jvm中运行前,编译器会做什么什么事呢,通过反编译工具我们可以看到其class文件内容:

Double d = Double.valueOf(12d);
我们再来看一下valueOf方法:

public static Double valueOf(double d) {
        return new Double(d);
    }
可以发现等于是new了一个Double对象,并把值“12”传给了这个对象d。

这就是我们老生常谈的“装箱”

那如果是:

Double d = 12d;
double i = d.doubleValue();

Long l = 12L;
Long ll = l.longValue();
Integer i = 12;
int in = i.intValue();

相信我们已经想到了,这就是所谓的拆箱。

下面象征性地总结一下:

  • 基本数据类型,类似于double、long、int的值如12d、12L、12赋值给对象类型(也就是包装类型)Double、Long、Integer时,就是所谓的装箱,在“幕后分别有Double.valueOf(12d)、Long.valueOf(12L)、Integer.valueOf(12)操作完成了装箱操作
  • 对象类型(也就是包装类型),类似于d、l、i调用doubleValue()、longValue()、intValue()时,就完成了拆箱操作
  • 特点:装箱...valueOf / 拆箱...Value
  • 所谓自动,是指的编译器完成的,对编码者是不可见的”,所以称之为自动
  • 基本数据类型是存储在中的,而包装类型是直接在堆内存中开辟了一块存储空间
之所以会有包装类型出现(这里有个契机,在java1.5随泛型一起出现的),自然有它的道理,我们来看一下:
  1. 在从数据库中查询某条数据(如分数)并用基本类型int来接收时,如果该条记录的分数暂时还没有值(我们假设在数据库中该字段可以为null),那我们由于用int接收,虽然没有值,但是int默认初始值为0.而如果我们用Integer类型接收时,就可以表示为null了。
  2. 泛型中(你有见过后者么,这样就不言自明了吧):
    Map<String, Integer> map = new HashMap<>();
    Map<String, int> map = new HashMap<>();
  3. 包装类型自然可以当做一个类来使用,JDK中的类自然就有可以使用的便捷方法,为我们编码提供了便利。
也都看到了,拆装箱其实也就这么回事(也有可能理解层次还不够 再见)。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值