Java 中的自动装箱和拆箱原理

写在前面

未经允许不得转载!

本来想偷懒不写的,但是找了一些网上的文章,感觉讲的不太好,所以专门写了这篇文章分享下。

相关链接

解答

首先,先了解下什么是自动装箱和拆箱(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)有对象缓存池的概念
    • 为啥要有这个玩意?
    • 可以修改池的范围(正数方向的)
      • 简单介绍下怎么改(基于jdk1.8.191),以Integer为例java.lang.Integer.IntegerCache
        • 获取当前的配置的值:VM.getSavedProperty("java.lang.Integer.IntegerCache.high")
        • 配置该值:设置虚拟机参数即可,比如设置为255,-Djava.lang.Integer.IntegerCache.high=255

猜你喜欢

转载自blog.csdn.net/u010643343/article/details/104748443
今日推荐