基本代码如下:
运行结果:
JDK1.5之后,加入自动装箱和拆箱的新特性,Integer i1 = 127 ,就是典型的将int类型自动装箱成Integer。装箱和拆箱的过程可以通过Javap命令查看到。例如:
可以看到 Integer i1 = 127,编译之后其实的调用的Integer.valueOf()方法进行自动装箱。其源码如下:
看到这里就可以明白为什么Integer i = 127的时候,i1和i2是相等的(原因是里面有IntegerCache缓存,IntegerCache有个Integer数组的成员变量,缓存范围是-128,127),而当Integer i = 128的时候,i3和i4都是新new的对象,其内存地址肯定不同。
IntegerCache的源码:
通过其源码看出,我们还可以设置参数来调整IntegerCache中缓存数组的大小,使得i3 可以等于i4。如下:
PS:java中基本类型的包装类的大部分都实现了常量池技术,即Byte,Short,Integer,Long,Character,Boolean;两种浮点数类型的包装类Float,Double并没有实现常量池技术。