5

Integer class,有private static class IntegerCache

这个类有什么用?

使用时有什么好处Integer

4

3 回答 3

9

缓存 -128 和 127 之间的值以供重用。这是元模式的一个例子,它通过重用不可变对象来最小化内存使用。


除了优化之外,此行为也是 JLS 的一部分,因此可以依赖以下内容:

Integer a = 1;
Integer b = 1;
Integer c = 999;
Integer d = 999;
System.out.println(a == b); // true
System.out.println(c == d); // false
于 2013-10-28T11:24:50.220 回答
5

IntegerCache 缓存 -128 到 +127 之间的值以优化自动装箱。

您可以将上限设置为大于127使用-XX:AutoBoxCacheMax=NEWVALUE-Djava.lang.Integer.IntegerCache.high=NEWVALUE

于 2013-10-28T11:30:28.090 回答
3

看看它的实现:

private static class IntegerCache {
   static final int high;
   static final Integer cache[];
   static {
      final int low = -128;
      int h = 127;
      if (integerCacheHighPropValue != null) {
          int i = Long.decode(integerCacheHighPropValue).intValue();
          i = Math.max(i, 127);
          h = Math.min(i, Integer.MAX_VALUE - -low);
      }
      high = h;
      cache = new Integer[(high - low) + 1];
      int j = low;
      for(int k = 0; k < cache.length; k++)
      cache[k] = new Integer(j++);
   }
   private IntegerCache() {}
}

缓存 256 个值以供再次使用,它们将在您创建第一个Integer对象时加载。

因此,当您使用==运算符检查Integer[-127,128] 范围内两个 s 的相等性时,您会得到它,就好像您在比较两个ints 时一样。但是,如果您使用 比较Integer超出此范围的两个 s ==,您将得到false,即使它们具有相同的值。

于 2013-10-28T11:32:36.597 回答