【问题标题】:What is the purpose of hashcode method in java? [duplicate]java中hashcode方法的目的是什么? [复制]
【发布时间】:2013-08-06 11:19:47
【问题描述】:

当我们有equals()compareTo() 方法时,为什么Java 中有hashcode() 方法?

如果我们使用HashTable,我们必须重写hashcode()方法,除了快速访问随机键之外还有什么特殊原因吗?如果我们重写 hashcode() 方法,可能的实现是什么?

Java 如何确保对象在内存中的唯一性?


Hashcodes are typically used to enhance the performance of large collections of data.

hashing 中,我们计算hash code。这是一项额外的任务。当我们对添加到集合中的每个对象执行附加操作时。性能如何提高?

【问题讨论】:

  • 为什么会有散列技术?默认情况下实现这些方法。如果你愿意,你可以覆盖它们。
  • 请编辑您的问题,以便人们了解您真正想知道的内容。
  • @AjayBhojak 编辑了问题
  • 这个问题应该重新打开,因为现在通过编辑应该清楚要问什么。

标签: java hashcode


【解决方案1】:

您必须始终同时覆盖equalshashCode,以满足它们相互依赖的合同。一个自相矛盾地实现它们的类即使在最低软件工程标准下也是完全不可接受的。

至于为什么人们会使用哈希表数据结构:因为它是随机访问键值存储的最快选择。

【讨论】:

  • 我们在 hashcode() 方法中写了什么代码?
  • 只有在对象的哈希码是合理的情况下,它才是最快的选择。让所有对象的哈希码返回 0 可以满足合同要求,但会使基于哈希的集合表现得非常糟糕。仅仅用盲目遵守合同的东西覆盖哈希码是没有帮助的。
  • @MaheshVarma 有一个标准的习惯用法来实现一个好的hashCode,并且它在网络上被广泛使用。为您生成整个 equalshashCode 方法也是大多数现代 IDE 的一个功能。
  • @MarkoTopolnik 谢谢
  • @MarkoTopolnik 我更新了问题
【解决方案2】:

使用compareTo 方法可以为您的对象建立一个"total order"。全序是一个相当弱的属性:它只能告诉您一个对象是否“小于”另一个对象,但它无法让您知道两个对象“相距多远”。

例如,如果您在键值数据结构中有 N 个对象,并且您想要查找给定键的值。只有一个总订单,您至少需要 O(log N) 比较才能找到匹配的键。

哈希码是一个更强大的属性,因为它可以告诉您两个对象是否有些相似或完全不同。多亏了这一点,哈希表可以通过 O(1) 操作找到键的值。

【讨论】:

  • 你能详细说明一下哈希码如何用于距离吗? AFAIK 你可以合法地将 hashCode 实现为类似于 MD5 的东西,并且它几乎不会包含关于两个对象有多“相似”的信息......
  • @c-x-berger 仅使用散列,您可以通过获取散列的 Hamming distance 来定义 metric in the mathematical sense(通俗地说是“距离”)。散列对象是否在其他意义上实际上非常不同并不重要。
  • 我还是不明白 - 你可以定义一个完美的“合法”hashCode,它非常地变化,甚至两个对象之间只有一个字节的差异。将其用作距离/相似性度量似乎(充其量)不是该方法的设计目的。 (默认的 impl 是内存位置 - 它有 zero 关于对象“相似性”的信息!)
  • 哈希码上的汉明距离为您提供了一个有效的“距离”度量,它遵循度量所需的所有定律(参见上面的维基百科链接)。这不是理性的人所说的距离,但它仍然是距离的有效度量。源对象中单个位的差异是否将它们分开半个宇宙并不重要。哈希码的唯一要求是“相等”的对象应该具有相同的哈希码,这样“相等”的对象之间的“距离”为零。
  • OP 的问题是“当我们已经有 equals 和 compareTo 时为什么还存在 hashCode”。我的回答是“因为哈希码比 compareTo 为您提供了更多关于近似对象相等性的信息”(在哈希码距离的意义上,具有相同哈希码的对象彼此靠近)。如果您想要更长的答案,可以发布一个新问题。
猜你喜欢
  • 1970-01-01
  • 2012-11-16
  • 2017-05-17
  • 1970-01-01
  • 2014-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多