美文网首页
有趣的IntegerCache

有趣的IntegerCache

作者: snakeSkin | 来源:发表于2017-03-15 00:44 被阅读52次

    一个很有趣的现象,下面这两个结果输出的结果是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。搞懂了这个是不是觉得很多问题迎刃而解!

    相关文章

      网友评论

          本文标题:有趣的IntegerCache

          本文链接:https://www.haomeiwen.com/subject/gtbknttx.html