有趣的IntegerCache

Posted 每天进步一点

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有趣的IntegerCache相关的知识,希望对你有一定的参考价值。

一个很有趣的现象,下面这两个结果输出的结果是false true,这是为什么?

  翻看Integer的源码可以看到,当new Integer(12);时,没有什么特别的,就是通过构造方法创建了一个Integer的对象,并将12赋值给对象的变量value。因此a!=b是正常的。而上面c==d是true就很奇怪,用javap -c Test.class 查看编译后的结果发现:Integer c = 12;这个操作在JVM中被优化成为了Integer.valueOf(12);

于是移步到Integer的valueOf(int i);这个方法:

 

发现一个很有意思的东西,在Integer中存在有一个IntegerCache这个内部类:

 

 

      它在初始化的时候将256个对象(从-128到127)[补充一下,这个最大值127是可以通过AutoBoxCacheMax进行配置的,只是默认为127],作为Integer的cache,也就是说它利用一个Integer cache[];提前创建了this.value = -128 ~ 127的对象放入到cache中。回到上面分析Integer c = 12;与Integer d = 12;c==d发现原来c和d根本就是cache中的同一个对象,自然返回的是true。搞懂了这个是不是觉得很多问题迎刃而解!

 
作者:joooooe
链接:http://www.jianshu.com/p/7c23cab491b5
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

以上是关于有趣的IntegerCache的主要内容,如果未能解决你的问题,请参考以下文章

开源精粹(二)!22个实用、有趣的开源项目

求一个简单又有趣的JAVA小游戏代码

看看有趣的ONOS Ⅲ:系统组成

有趣的.py:从命令行短接url,使用有趣的服务

有趣的数

有趣的跳跃