浅析Integer常量池

基本代码如下:

运行结果:

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并没有实现常量池技术。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容