4

我一直在阅读类的 java 缓存,但我不确定为什么这段代码有效。

Integer x = new Integer(2);
Integer y = new Integer(2);
assert x            != y;
assert x.intValue() == y.intValue();
++x;
assert x            != y;
assert x.intValue() != y.intValue();
++y;
assert x            == y;
assert x.intValue() == y.intValue();

我知道最初 x 和 y 不相等,因为它们引用了不同的对象,但是为什么在 ++ 之后它们变得相等?

4

2 回答 2

5

在增量之后,它们使用 重新装箱Integer.valueOf(),对于小的绝对值(默认情况下) -128127使用缓存的实例。

于 2012-11-01T00:09:16.537 回答
4

这里的关键字是整数缓存*Integer下的值被缓存,并返回一个实习结果。128++valueOf

您可以执行两个有趣的实验来了解缓存的Integers工作原理:

  • 替换new Integer(2)为,并立即Integer.valueOf(2)观察x==y
  • 替换2200,观察x++y++返回不同的对象


*有一个选项可以控制:java.lang.Integer.IntegerCache.high=high_val

于 2012-11-01T00:10:17.020 回答