Java中hashCode的用途是什么?

Vin*_*mar 145 java hashcode

在Java中,obj.hashCode()返回一些值.这个哈希码在编程中有什么用?

小智 204

hashCode()用于桶装Hash像实施方式中HashMap,HashTable,HashSet,等.

接收到的值hashCode()用作存储集合/映射元素的存储桶编号.此桶号是集/映射内元素的地址.

当你这样做时contains(),将获取元素的哈希码,然后查找哈希码指向的桶.如果在同一个桶中找到多于1个元素(多个对象可以具有相同的哈希码),那么它使用该equals()方法来评估对象是否相等,然后判断if contains()是true还是false,或者判断element是否可以在集合中添加或不添加.

  • 嗨Buddy ..非常好的答案,但我找到了一个非常有趣的链接相同的易于理解的实际例子:http://www.coderanch.com/t/321515/java/java/HashCode (25认同)
  • “如果在同一个bucket中找到超过1个元素..那么它使用`equals()`来评估”,那么如果只找到一个hash code匹配的元素,它会直接返回true吗?但是由于**多个对象可以具有相同的哈希码**,所以它必须运行`equals()`来评估匹配的元素是否相等,否则它可能会给你意想不到的结果,对吗? (2认同)

Joh*_*ley 31

来自Javadoc:

返回对象的哈希码值.支持此方法的好处是哈希表,例如提供的哈希表java.util.Hashtable.

总合同hashCode是:

  • 每当在执行Java应用程序期间多次在同一对象上调用它时,该hashCode方法必须始终返回相同的整数,前提是不修改对象的等比较中使用的信息.从应用程序的一次执行到同一应用程序的另一次执行,该整数不需要保持一致.

  • 如果根据equals(Object)方法两个对象相等,则hashCode在两个对象中的每一个上调用方法必须产生相同的整数结果.

  • 如果两个对象根据方法不相等则不是必需的,则在两个对象中的每一个上equals(java.lang.Object)调用hashCode方法必须产生不同的整数结果.但是,程序员应该知道为不等对象生成不同的整数结果可能会提高哈希表的性能.

尽可能合理,Object类定义的hashCode方法确实为不同的对象返回不同的整数.(这通常通过将对象的内部地址转换为整数来实现,但Java编程语言不需要此实现技术.)


小智 14

返回的值hashCode()是对象的哈希码,它是十六进制的对象的内存地址.

根据定义,如果两个对象相等,则它们的哈希码也必须相等.如果重写该equals()方法,则更改两个对象的等效方式,并且Object的实现hashCode()不再有效.因此,如果重写equals()方法,则还必须覆盖该hashCode()方法.

这个答案来自java SE 8官方教程文档


roo*_*ler 12

hashCode()是一个获取对象并输出数值的函数.如果对象不更改,则对象的哈希码始终相同.

像功能HashMap,HashTable,HashSet等需要存储对象将使用hashCode其内部数组的模的大小是什么"记忆位置"(即阵列位置)来选择存储对象.

在某些情况下可能会发生冲突(两个对象最终使用相同的哈希码),当然,需要仔细解决.


Sat*_*jit 8

哈希码是从任何对象生成的数字。

这就是允许对象在 Hashtable 中快速存储/检索的原因。

想象一下下面这个简单的例子

在你面前的桌子上。你有九个盒子,每个盒子都标有数字 1 到 9。你还有一堆截然不同的物品要存放在这些盒子里,但是一旦它们在那里,你需要能够尽快找到它们。

您需要的是一种立即决定将每个对象放入哪个框的方法。它的工作方式类似于索引。你决定找到卷心菜,所以你查找卷心菜在哪个盒子里,然后直接去那个盒子拿它。

现在想象一下,您不想打扰索引,您希望能够立即从对象中找出它所在的盒子。

在该示例中,让我们使用一种非常简单的方法来执行此操作 - 对象名称中的字母数。所以卷心菜放在盒子 7 里,豌豆放在盒子 3 里,火箭放在盒子 6 里,班卓琴放在盒子 5 里,依此类推。

然而,犀牛呢?它有 10 个字符,所以我们将稍微改变我们的算法并“环绕”,以便 10 个字母的对象进入框 1,11 个字母进入框 2,依此类推。这应该涵盖任何对象。

有时一个盒子里会有不止一个物体,但如果你正在寻找火箭,比较花生和火箭仍然比检查一整堆卷心菜、豌豆、班卓琴和犀牛要快得多。

那是一个哈希码。一种从对象中获取数字以便将其存储在哈希表中的方法。在 Java 中,哈希码可以是任何整数,每个对象类型负责生成自己的。查找 Object 的“hashCode”方法。

来源 -这里


卢声远*_* Lu 6

虽然hashcode对您的业务逻辑没有任何作用,但在大多数情况下我们必须处理它.因为当您的对象被放入基于哈希的容器(HashSet,HashMap ...)时,容器会放置/获取元素的哈希码.