写在前面
未经允许不得转载!
本来想偷懒不写的,但是找了一些网上的文章,感觉讲的不太好,所以专门写了这篇文章分享下。
相关链接
解答
首先,先了解下什么是自动装箱和拆箱(Autoboxing and Unboxing)。
- 自动装箱(Autoboxing ):Java编译器在 基本数据类型(the primitive types) 及 其对应的对象包装器类 之间进行的自动转换。例如,将
int
转换为Integer
,将double
转换为Double
,依此类推。 - 拆箱(Unboxing):自动装箱的反向操作。也就是将
Integer
转换为int
,将Double
转换为double
,依此类推。
推出自动装箱和拆箱功能,主要还是为了使代码更加简洁。
用法(以 int 及其包装器类为例)
// 不需要手动 new 一个 Integer 对象
Integer integer = 10;
// 不需要手动将 Integer 对象转成 int 值
int num = integer;
解析
从java代码上看不出他是咋做的,所以可以从字节码的层面看。
解析自动装箱
从字节码上可以看出Integer integer = 10;
最终在编译后会变成Integer integer = Integer.valueOf(10);
,这里附上对应的字节码片段:
bipush 10
invokestatic java/lang/Integer.valueOf(I)Ljava/lang/Integer;
astore1
解析拆箱
从字节码上可以看出int num = integer;
最终在编译后会变成调用Integer
实例的intValue()
方法,也就是会变成(以上面的代码为例)int num = integer.intValue();
,这里附上对应的字节码片段:
aload1
invokevirtual java/lang/Integer.intValue()I
istore2
内容加强
知道了自动装箱和拆箱是如何后,就可以加强对部分代码的运用了。
- 可以直接用基本数据类型(the primitive types)值与其对应的对象包装器类的实例对象进行值大小判断
- 拆箱的时候需要注意:NullPointerException
- 自动装箱的时候需要注意,有的基础数据类型包装器类(如Integer)有对象缓存池的概念
- 为啥要有这个玩意?
- 参考已经解答过的文章
- JDK 8 语言规范中对装箱转换的讲解(上文中有链接)中有原文
- 可以修改池的范围(正数方向的)
- 简单介绍下怎么改(基于jdk1.8.191),以Integer为例
java.lang.Integer.IntegerCache
- 获取当前的配置的值:
VM.getSavedProperty("java.lang.Integer.IntegerCache.high")
- 配置该值:设置虚拟机参数即可,比如设置为255,
-Djava.lang.Integer.IntegerCache.high=255
- 获取当前的配置的值:
- 简单介绍下怎么改(基于jdk1.8.191),以Integer为例
- 为啥要有这个玩意?