【问题标题】:Java cache and equalityJava缓存和相等
【发布时间】:2012-11-01 00:07:53
【问题描述】:

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

【问题讨论】:

    标签: java caching object integer equality


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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


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

      【讨论】:

      • 这些值是池化的,而不是留存的。
      • @SteveKuo 感谢您的注意,我将此与字符串实习混淆了。现在已修复。
      猜你喜欢
      • 2014-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-05
      • 1970-01-01
      • 1970-01-01
      • 2013-12-31
      相关资源
      最近更新 更多