Java缓存和相等性

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不相等是因为它们引用了不同的对象,但为什么在++之后它们会变得相等呢?

2个回答

5
在增量操作之后,它们会使用Integer.valueOf()重新打包,并且对于小的绝对值(默认情况下在-128127之间),该方法使用缓存实例。

4
关键词是“整数缓存”。在128*以下的Integer值会被缓存,++返回一个内部的valueOf结果。
有两个有趣的实验可以帮助你理解Integers的缓存机制:
  • Integer.valueOf(2)替换new Integer(2),并观察x==y的结果
  • 200替换2,并观察x++y++返回不同的对象


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


这些值是被池化的,而不是被内部化的。 - Steve Kuo
@SteveKuo 感谢您的提醒,我把这个和字符串驻留混淆了。现在已经修复了。 - Sergey Kalinichenko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接