美文网首页
有趣的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

    一个很有趣的现象,下面这两个结果输出的结果是false true,这是为什么? 翻看Integer的源码可以...

  • IntegerCache

    参考链接:IntegerCache的妙用和陷阱! 我们知道==比较的是对象的引用,那这里为什么会这出这种情况呢? ...

  • IntegerCache

    int的包装类就是Integer,从Java 5开始引入了自动装箱/拆箱机制,使得二者可以相互转换。 Intege...

  • Integer 源码

    1. 静态内部类 IntegerCache

  • Integer的IntegerCache

    首先我们对两个Integer进行比较 上面的程序允许结果如下: Java 编译器把原始类型自动转换为封装类的过程称...

  • Integer Integer.valueOf和Integer.

    Integer Integer是int的包装类,在Integer中有个常量池类IntegerCache,在 In...

  • java常见的坑

    1、对于Integer var=?在-128至127之间的赋值,Integer对象是在IntegerCache.c...

  • Integer缓存机制

    Intgeter的缓存机制 Integer缓存的源码如下,IntegerCache在类加载的时候,创建了256个缓...

  • IntegerCache的妙用和陷阱!

    考虑下面的小程序,你认为会输出为什么结果? 答案如下: true false 是否和你预想的一致? 我们知道==比...

  • Java装箱类缓存分析

    Integer Integer内部有一个IntegerCache类,这个类用来缓存int型数值,默认缓存的范围是-...

网友评论

      本文标题:有趣的IntegerCache

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