【问题标题】:What's the implementation of hashCode in java Object? [duplicate]java Object中hashCode的实现是什么? [复制]
【发布时间】:2012-11-16 03:39:23
【问题描述】:

可能重复:
How is hashCode() calculated in Java

我发现Java中根类ObjecthashCode()方法没有实现:

public native int hashCode(); 

如果我有一个Object a 和一个Object b,我怎么知道a.hashCode()b.hashCode() 的值而不使用System.out.println()?只需通过 hashCode 实现即可。

我尝试了new 两个ArrayList 对象,令我惊讶的是hashCode() 的值是相同的:它们都是1。

【问题讨论】:

  • 可能是内存地址。你想做什么?或者您只是好奇它是如何实现的?
  • @nbrooks :它不是重复的
  • 它为您提供与 System.identityHashCode(x) 相同的值,如果对象的 hashCode() 已被覆盖,这将很有用。
  • 对“可能重复”的公认答案甚至没有提到 Object 类——它怎么可能回答这个问题?人们将很多东西标记为重复,这让我很恼火。是否可以将其取消标记为重复项或将其正确链接到回答相同问题的重复项,例如:stackoverflow.com/questions/2237720/…

标签: java java-7 hashcode


【解决方案1】:

默认的hashcode() 实现经常但并不总是根据对象的内存地址松散地提供一个整数,但是内存地址可以更改。这可能会因 JVM 实现而有所不同。

hashCode()

如您所知,此方法提供对象的 has 代码。基本上 Object 提供的 hashCode() 的默认实现是派生的 通过将内存地址映射到整数值。如果查看 Object 类的源代码,您将找到以下代码 哈希码。

public native int hashCode();

表示 hashCode 是提供 内存地址在一定程度上。然而有可能 覆盖实现类中的 hashCode 方法。

http://www.javaworld.com/community/node/1006

【讨论】:

  • 这不准确。内存地址可以改变,hashcode 不能。
  • 这甚至都不正确,Javadoc 也是这么说的。您的引文不是规范性参考,自 1997 年以来,它提出的主张就不再正确。“在一定程度上”应该是什么意思。
  • @JanDvorak 我不应该如此具体地措辞。我在回答中考虑了您的建议。
  • @EJP 来自 Java Doc (This is typically implemented by converting the internal address of the object into an integer, but this implementation technique is not required by the JavaTM programming language.) 我同意它不是绝对来自内存地址,但似乎有很强的相关性。
  • 重点是Javadoc 没有指定所需的实现技术,因此您不能定义一个作为这个问题的答案。它只指定了实现的要求。
【解决方案2】:

hashCode 是一个native 方法,这意味着系统库在内部被调用。详情请见Java Native Interface

有一个关于 SO Why hashCode() and getClass() are native methods? 的问题可能对你很感兴趣。

【讨论】:

    【解决方案3】:

    默认的 hashCode 将是特定于实现的。我怀疑它与内存地址有关,但请注意 VM 在内存中移动对象(当然,hashCode 必须保持不变)。所以它不会是实际内存地址。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-12
      • 1970-01-01
      相关资源
      最近更新 更多