浅析Integer常量池

基本代码如下:

浅析Integer常量池_第1张图片

运行结果:

JDK1.5之后,加入自动装箱和拆箱的新特性,Integer i1 = 127 ,就是典型的将int类型自动装箱成Integer。装箱和拆箱的过程可以通过Javap命令查看到。例如:

浅析Integer常量池_第2张图片

可以看到 Integer i1 = 127,编译之后其实的调用的Integer.valueOf()方法进行自动装箱。其源码如下:

浅析Integer常量池_第3张图片

看到这里就可以明白为什么Integer i = 127的时候,i1和i2是相等的(原因是里面有IntegerCache缓存,IntegerCache有个Integer数组的成员变量,缓存范围是-128,127),而当Integer i = 128的时候,i3和i4都是新new的对象,其内存地址肯定不同。

IntegerCache的源码:

浅析Integer常量池_第4张图片

通过其源码看出,我们还可以设置参数来调整IntegerCache中缓存数组的大小,使得i3 可以等于i4。如下:


PS:java中基本类型的包装类的大部分都实现了常量池技术,即Byte,Short,Integer,Long,Character,Boolean;两种浮点数类型的包装类Float,Double并没有实现常量池技术。

你可能感兴趣的:(浅析Integer常量池)