Integer 的缓存池
JAVA8中,Integer的缓存池大小默认为 -128~127
-
new Integer(value) 必定会创造新的对象,所以使用"=="判断两个Integer对象结果必然为false。
-
Integer.valueOf(value)则会使用缓存池中(-128~127)的对象,多次调用会取得同一对象的引用,valueOf()方法实现如下:
public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }
-
Integer x = value; 首先右边是int类型,编译器会自动装箱,调用valueOf()方法,因此在缓存池中的相同值引用相同的对象。
-
在 jdk 1.8 所有的数值类缓冲池中,Integer 的缓冲池 IntegerCache 很特殊,这个缓冲池的下界是 - 128,上界默认是 127,但是这个上界是可调的,在启动 jvm 的时候,通过 -XX:AutoBoxCacheMax= 来指定这个缓冲池的大小,该选项在 JVM 初始化的时候会设定一个名为 java.lang.IntegerCache.high 系统属性,然后 IntegerCache 初始化的时候就会读取该系统属性来决定上界