【问题标题】:What is the hashCode of an AtomicBoolean? [duplicate]AtomicBoolean 的 hashCode 是什么? [复制]
【发布时间】:2017-05-17 21:50:27
【问题描述】:

我在官方文档中找不到任何信息。我知道Boolean.hashCode(boolean b) 返回两个素数 1231 和 1237 表示真假。我希望在AtomicBoolean 中有类似的实现。但是在反编译的类文件中,它似乎调用了Objectpublic native int hashCode(); - 这是否意味着它会返回内存位置?

【问题讨论】:

  • 您可以简单地尝试一下,看看会发生什么。

标签: java hashcode atomicboolean


【解决方案1】:

AtomicBoolean 不会覆盖hashCode()(或equals(Object),就此而言)方法。它使用来自java.lang.Object 的默认实现。虽然 JLS 没有指定,但这个实现通常只返回对象的内部地址,表示为 int

【讨论】:

    【解决方案2】:

    AtomicBoolean 不会覆盖 hashCode(或 equals),因此它继承了默认的 Object 行为。

    这实际上很有意义。 hashCode 的主要用例是让对象成为哈希映射的键,但它是dangerous to mutate keys once they're in a map。由于 AtomicBoolean 的主要属性是它的可变性,这使得它不适合 HashMap 键。

    换句话说:如果你需要它作为一个 HashMap 键,你不应该改变它,如果你不打算改变它,那么你不应该使用 AtomicBoolean。

    【讨论】:

      【解决方案3】:

      package summary 说明了为什么 hashCode 没有被 AtomicBoolean 覆盖:

      原子类不是 java.lang.Integer 和相关类的通用替代品。它们没有定义诸如equalshashCodecompareTo 之类的方法。 (因为预计原子变量会发生变异,所以它们不是哈希表键的糟糕选择。)

      这是否意味着它会返回内存位置?

      这取决于您使用的 JVM,但是是的,它通常来自内存地址。其他 JVM 可能只使用随机数。

      【讨论】:

        【解决方案4】:

        java.util.concurrent.atomic.AtomicBoolean 使用对象方法的哈希码,在类中没有被覆盖。所以它使用对象类的默认hascode。

        【讨论】:

          猜你喜欢
          • 2012-11-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多