Java中的整数缓存

Ber*_*sta 48 java optimization jvm

可能重复:
奇怪的Java拳击

最近我看到了一个演示文稿,其中有以下Java代码示例:

Integer a = 1000, b = 1000;  
System.out.println(a == b); // false  
Integer c = 100, d = 100;  
System.out.println(c == d); // true
Run Code Online (Sandbox Code Playgroud)

现在我有点困惑.我理解为什么在第一种情况下结果是"假" - 这是因为Integer是一个引用类型,而"a"和"b"的引用是不同的.

但为什么在第二种情况下结果是"真实的"?

我听说过一个观点,即JVM将对象的int值从-128缓存到127以进行某些优化.以这种方式,"c"和"d"的引用是相同的.

有人可以给我更多关于这种行为的信息吗?我想了解这种优化的目的.在什么情况下性能提高等等.参考这个问题的一些研究将是伟大的.

Mic*_*rdt 52

我想了解这种优化的目的.在什么情况下性能提高等等.参考这个问题的一些研究将是伟大的.

目的主要是节省内存,由于更好的缓存效率,这也可以带来更快的代码.

基本上,Integer该类保留了Integer-128到127范围内的实例缓存,并且所有自动装箱,文字和用法Integer.valueOf()都将从该缓存中返回其覆盖范围的实例.

这是基于这样的假设,即这些小值比其他整数更频繁地出现,因此避免为每个实例使用不同对象的开销是有意义的(Integer对象占用12个字节之类的东西).

  • 请注意,只有使用自动装箱或静态方法Integer.valueOf()时,缓存才有效.调用构造函数将始终生成一个新的整数实例,即使该实例的值在-128到127范围内. (12认同)
  • @David Doria:你似乎对"实例"是什么有严重的误解.从根本上说,不可能有两个不同的值"属于同一个Integer实例".Object实例基本上是一个内存区域.您可以将多个不同的实例具有相同的值,但不能反过来.缓存将为不同的值返回不同的实例; 它只是确保您始终为相同的值获取相同的实例. (2认同)

dty*_*dty 10

看看执行情况Integer.valueOf(int).Integer对于小于的输入,它将返回相同的对象256.

编辑:

它实际上是-128+127在默认情况下,如下所述.

  • 实际上默认范围是-128 <= i <= 127.似乎有一个系统属性(java.lang.Integer.IntegerCache.high)可以影响要缓存的整数的最大值. (4认同)