Integer包装类包箱拆箱小秘密?

来源:互联网 发布:淘宝零食店推荐 编辑:程序博客网 时间:2024/05/16 05:43

问题1:

Integer i1 = 127;Integer i2 = 127;System.out.println(i1 == i2); //true
分析:
After compiling,This statement(Integer i1 = 127; ) is turned into Integer b = Integer.valueOf(127); 也就是说,经编译器编译后,Integer i1 = 127;这个语句相当于Integer b = Integer.valueOf(127);也就是所谓的“包箱”过程。那为什么结果还是true呢?不是对比两个地址吗?没错,是对比两个地址,答案就出在Integer.valueOf(int)方法,请看。

public static Integer valueOf(int i) {assert IntegerCache.high >= 127;if (i >= IntegerCache.low && i <= IntegerCache.high)return IntegerCache.cache[i + (-IntegerCache.low)];return new Integer(i);}

真相大白,原来Integer类中的内部类帮我们缓存了一个Integer类型的数组(没想到吧,醉醉再见,这个数组的范围默认是-128至127(其中最小值-128是固定的,最大值127是默认的,可以通过虚拟机的配置而改变其大小)。因为127在缓存范围内,所以,i1 == i2其实是两个相同的引用值。


问题2:

Integer i1 = 128;Integer i2 = 128;System.out.println(i1 == i2); //false

分析:
由问题1可知Integer i1 = 128;先将i1“包箱”;又因为128超出缓存范围,valueOf方法各自new Integer(128),所以i1 == i2是两个不同的引用值,结果为false.


问题3:

Integer i1 = 128;int i2 = 128;System.out.println(i1 == i2); //true
分析:
首先Integer i1 = 128;先将i1“包箱”,执行i1 == i2(Integer类参与算术运算时),i1会被“拆箱”,虚拟机会调用Integer类的intValue方法将其转换为int型,所以i1==i2 等价于128 == 128

总结:
将一个int常量赋值给Integer类,虚拟机调用valueOf方法包装它,将int变成一个Integer型,即“包箱”,并且会返回相应的缓存值,默认范围是-128-127

用Integer类做算术运算,虚拟机会调用intValue拆开它将Integer变成一个int常量,即“拆箱”

0 0
原创粉丝点击