有趣的IntegerCache

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

有趣的IntegerCache_第1张图片

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

有趣的IntegerCache_第2张图片

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

有趣的IntegerCache_第3张图片

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

有趣的IntegerCache_第4张图片

      它在初始化的时候将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_第5张图片

你可能感兴趣的:(有趣的IntegerCache)