首页 >> 知识 >> (详解)Java中Integer类的自动装箱、拆箱?看这一篇就够了

(详解)Java中Integer类的自动装箱、拆箱?看这一篇就够了

先看两个小栗子,整片博文围绕这个例子进行详解。

你可以先自己猜猜运行结果,然后再运行代码哦。这样理解会比较深刻。

先一个个来!!!!

栗子1:

public class IntegerTest { public static void main(String[] args) { Integer a = new Integer(11); Integer b = 11; int c = 11; System.out.println(a == c); System.out.println(a == b); }}

 

===================================================

防止你这么快看到答案!

===================================================

true false

你的结果是不是也是这个呢,如果不是也没关系,看完我下面所写的,会让你对Integer类的自动拆箱装箱有深刻的理解。

首先我来大概解释下这是怎么回事

1、a==c 为什么会是true呢?

因为c为基本类型,c(int)与a(Integer)比较时,c(Integer)会发生自动拆箱,a会拆箱成int来与c进行==比较。所以这里为true。

你听到这可能还是不理解拆箱,不用担心后面会讲到的,这只是大概告诉你发生了什么事,后面会用代码来证明的。

只有代码才是对的!

2、a==b为什么会是false呢?

因为a是Integer类型,b也是Integer类型,b这里进行了装箱操作,Integer b = 11,其实是等于Integer b = Integer.valueOf(3);

这里为什么会等于这个后面会讲到,你想想,Integer是引用类型,==是比较地址的,ab两个栈中的指向堆中的地址都不一样,所以他们是false。

==================================================

好了 重头戏来了

==================================================

这里你可以看着我来操作,当然也可以一起操作,这都很简单,只需要你有jdk+jre环境即可。

这里讲个题外知识,因为后面会用到,那就是javap

javap定义

javap是 Java class文件分解器,可以反编译(即对javac编译的文件进行反编译),也可以查看java编译器生成的字节码。用于分解class文件。

好了先创建一个IntegerTest.java文件将上面的栗子拷贝进去在当前目录 shift+鼠标右键打开powerShell窗口然后输入两个命令 1、javac .IntegerTest.java   2、javap -c IntegerTest到这里就完事了,后面刷出一大堆javap -c 反汇编后的信息。咱们来阅读一下。

=============================================================

上面你看不懂没关系,我也不大懂,只需要有个javap指令集,将不懂的命令找出来解释就完事了 。

这里有个小福利,javap指令集的帖子

http://bbs.gupaoedu.com/forum.php?mod=viewthread&tid=295&extra=page%3D1

=============================================================

咱们来解析一下 咱们栗子中的每一行代码 对应指令集中的什么地方,根据咱们反汇编的class文件来分析jvm是如何运转的呢。

1、Integer a = new Integer(11);

咱们根据javap指令可以知道,invokespecial 根据编译时类型来调用实例方法,这个方法是什么呢,就是Integer的构造方法。

Integer的构造方法:

所以这行代码没什么好说的了,就是实例化一个Integer对象。设置value属性的值为11。主要是为了让大家熟悉下javap指令。

2、Integer b = 11;

重头戏来了,这里讲了装箱操作。

这里看到没有!!!invokestatic!他这里做了什么,他调用了Integer中的一个方法名叫做valueOf的静态方法。

咱们看看Integer的源码:

找到了,我来解释下这里说了什么,如果入参i的值-128

网站地图