java中的拆箱和装箱是指什么_java中的装箱和拆箱

一、什么是装箱和拆箱

JAVA中基本数据类型与它们的包装类进行运算时,编译器会自动帮我们进行转换,转换过程是透明的。其中,装箱就是自动将基本数据类型转换为包装器类型;拆箱就是自动将包装器类型转换为基本数据类型。

基本数据类型:int(4字节)、byte(1字节)、short(2字节)、long(8字节)、float(4字节)、double(8字节)、char(2字节)、boolean(未定)

对应包装类型:Integer、Byte、Short、Long、Float、Double、Char、Boolean

一个简单例子:

b12bc8a054a9af86d1b97f6399547b2e.png

二、装箱和拆箱的实现过程

通过javap命令对上例反编译得到如下图所示字节码内容:

a9fc6a129ccb9c48c6c063b89975c097.png

由上图可知,在装箱的时候自动调用的是Integer的valueOf(int)方法,在拆箱的时候自动调用的是Integer的intValue方法。

事实上,装箱过程就是通过调用包装器的valueOf方法实现,而拆箱过程是通过调用包装器的 xxxValue方法实现。(xxx代表对应的基本数据类型)

三、一道面试题

下面代码块的输出结果是什么?

ecb7f0af1f92cfa3683199510047aa61.png

答案是:

true

false

原因分析:i1,i2,i3和i4都进行了自动装箱,也即执行了valueOf函数,函数源码(jdk1.8.0_111)如下:

c9efda6baab4a79e6e80392f3f0a9963.png

其中,IntegerCache的实现如下:

873637cec03e115803a8ac32baf4ac43.png

从源码可知,如果数值在[-128,127]之间,则返回IntegerCache.cache中已经存在的对象的引用,否则创建一个新的Integer对象。而100在[-128,127]之间,200在该范围之外,故i1和i2指定同一对象,而i3和i4指定不同对象。

对于其他类型的自动装箱分析可参考以上思路,结果可能会因为valueOf的具体实现而不同。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值