乐趣区

关于integer:缓存池

new Integer(123) 与 Integer.valueOf(123) 的区别在于:

  • new Integer(123) 每次都会新建一个对象;
  • Integer.valueOf(123) 会应用缓存池中的对象,屡次调用会获得同一个对象的援用。
Integer a = 123;
Integer b = new Integer(123);
Integer c = Integer.valueOf(123);
System.out.println(a==b);
System.out.println(a==c);

编译器会在主动装箱过程调用 valueOf() 办法,因而多个值雷同且值在缓存池范畴内的 Integer 实例应用主动装箱来创立,那么就会援用雷同的对象。

valueOf() 办法的实现比较简单,就是先判断值是否在缓存池中,如果在的话就间接返回缓存池的内容。

public static Integer valueOf(int i) {if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

根本类型对应的缓冲池如下:

  • boolean values true and false
  • all byte values
  • short values between -128 and 127
  • int values between -128 and 127
  • char in the range u0000 to u007F

在应用这些根本类型对应的包装类型时,如果该数值范畴在缓冲池范畴内,就能够间接应用缓冲池中的对象。

在 jdk 1.8 所有的数值类缓冲池中,Integer 的缓冲池 IntegerCache 很非凡,这个缓冲池的下界是 – 128,上界默认是 127,然而这个上界是可调的,在启动 jvm 的时候,通过 -XX:AutoBoxCacheMax=<size> 来指定这个缓冲池的大小,该选项在 JVM 初始化的时候会设定一个名为 java.lang.IntegerCache.high 零碎属性,而后 IntegerCache 初始化的时候就会读取该零碎属性来决定上界。

退出移动版