Java自动拆装箱(Autoboxing and unboxing)学习

 在学习并发的过程中,用“Boolean bool = true”的自动装箱方式初始化了两个对象锁去锁两块代码,结果运行的时候出现了竞争等待,调试了一下发现两个锁变量指向的是同一个对象,由此可见我对自动拆装箱的机制想的太简单了,查了一下,发现这个机制还挺细节,那就记录一下:

本文主要有以下几个方面:

  • 什么是自动拆装箱
  • 拆装箱的实现
  • 拆装箱发生的场景
  • 关于String
  • 回首望月

尝试的第一篇博客,不当之处,求轻喷!


 

一. 什么是自动拆箱与装箱

我们都知道,Java定义了8种基本类型和与之对应的8中包装器,其中6种数据类型,1种字符类型以及1种布尔类型: 

在Java5之前,定义生成一个Integer包装器类型的对象,只能通过以下方式:

复制代码
1 Integer i = new Integer(0);
复制代码

Java5支持了基本类型和对应的包装类型之前的自动转换机制,即自动拆箱(包装器类型转换成基本类型)与装箱(基本类型封装成包装器类型)。于是,就有了以下两行代码:

复制代码
1 Integer i = 0; //自动装箱2 int j = i; //自动拆箱
复制代码
 

二. 自动拆装箱的实现(int-Integer为例)

我们将下面自动拆装箱的代码反编译一下,拆装箱的动作就一目了然。 

复制代码
1 public class MainTest { 2     public static void main(String[] args) { 3         Integer i = 0; 4         int j = i; 5     } 6 }
复制代码

编译后:

通过反编译的结果看,在"Integer i = 0"自动装箱的过程中,调用了Integer.valueOf(int i)方法;在"int j = i;"的自动装箱的过程中,调用了Integer.intValue()方法。

其中,拆箱方法Integer.intValue()方法很简单:

关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信