用源码看Integer的装箱
在看Object类时,不知不觉回顾到了之前学的迷迷糊糊的包装类,正好借着最新牛客刷题也遇到了这一块,就简单总结一下。
为弥补JAVA之前基本数据类型不能作为对象操作,引入了Integer包装类,int的包装类就是Integer,从Java 5开始引入了自动装箱/拆箱机制,使得二者可以相互转换,且int的初始值为0,Integer的初始值为null。
1、先抛一个疑问:Why下图中打印的前三个结果?
2、基础–从基本数据类型(int)到包装类型(Integer)的过程是装箱、从包装类型到基本数据类型的过程是拆箱。上图标示了装箱和拆箱的两个过程。
解惑:
(1)i == i1:由于i本身是new Integer的方式单独在堆开辟空间,根据Integer.valueOf()查看源码(推荐大家在日常学习中尝试更多得接触源码,深入体会JAVA,会慢慢提高兴趣,利于学习),其内部类IntegerCache中Integercache[]数组做缓存定义好-128到127的数值的对象,返回这个创建好的数组中对应对象。i1=120 在[-128,127],则返回120,i1是从缓存中取出数据的,缓存的地址和i(new Integer)单独开辟空间对应的地址不同,返回false。
(2) i1 == i2:i1=120 在[-128,127],所以i1是从缓存中取出数据的。i2=120 在[-128,127],所以i2也是从缓存中取出数据的。所以i1和i2对应的是同一Integr(100)(对象同一个缓存地址),返回true。
(3)i3 == i4 :虽然i3=i4=128>127,但是i3和i4分别是new Integer这种单独开辟堆空间,地址不同,返回false。