2

我只是想知道为什么java中的每个对象都包含一个哈希码。为什么通常为每个对象分配不同的哈希码,但两个哈希码编号可能具有不同的值。

规则“规则?如果两个 key 相同,则生成相同的 hashcode 编号,但如果两个 hashcode 编号相同,则 key 可能相同或不同。”

如果两个键(在哈希表上下文中)相同,为什么哈希码编号相同?

4

5 回答 5

2

哈希函数的重点是显着缩小您需要查找某个特定键的位置。

一个非常基本的示例是在字典中,具有“单词中的第一个字母”的哈希函数:一旦您将搜索范围缩小到以该字母开头的字典部分,您就已经淘汰了大多数的可能性非常有效。此外,查找字典中以字母 J 开头的部分相对较快:比直接查找特定单词要快得多。

哈希函数的目的是找到与某个特定的键相关联的特定数字它消除了大多数可能性,即使它不能消除所有可能性。

于 2013-02-01T04:31:35.970 回答
1

Java 中的每个对象都需要能够产生一个哈希码,不一定包含一个。

散列码用于在关联容器中查找,例如散列映射和散列集。哈希码不需要唯一,但是当对象用作哈希映射中的键时,哈希码越唯一越好。当两个键相同时,对象需要 (1) 逻辑上相等,或 (2) 覆盖equals以区分两个对象。

于 2013-02-01T04:31:59.353 回答
1

在 JDK 内部的许多情况下都需要哈希码,因为某些数据结构使用它及其属性按需要工作(特别是HashMapHashSet)。这是因为它能够以足够安全的方式识别类的特定实例。

哈希码是有限的信息(通常具有固定大小),因此,虽然您必须确保同一个对象具有相同的哈希码,但您不能确保两个不同的对象具有不同的哈希码。这是因为存储在哈希码中的信息量通常小于生成它的对象中包含的信息量。你想要的是发生冲突的概率足够低,可以很好地与所需的算法一起工作(当然这意味着你不能假设哈希码的唯一性,除非在特定情况下)

于 2013-02-01T04:32:12.960 回答
0

如果两个键相同,为什么哈希码编号相同?

仅仅因为这就是使哈希表起作用的原因!

哈希表有效(并且高效),因为它使用“相等”键具有相同哈希码的事实来减少查找时必须查看的键数量。equals(Object)和的语义hashcode()被定义为按照它们的方式工作,以便对象(符合语义契约......)可以用作哈希表1中的键。

要了解哈希表的工作方式和原因,您可能应该阅读一本关于算法的好教科书,或者阅读有关此主题的 Wikipedia 页面:http ://en.wikipedia.org/wiki/Hash_table 。他们可以比我们更好地解释它......


1 - 还有另一个先决条件......当密钥在哈希表中使用时,密钥的哈希码不应更改。

于 2013-02-01T04:59:38.003 回答
0
public int hashCode()

返回对象的哈希码值。支持这种方法是为了有利于哈希表,例如由 提供的哈希表HashMap。(这通常通过将对象的内部地址转换为整数(32 位有符号整数)来实现)

hashCode的通用合约:

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

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

  • hashCode每当重写此方法时,都必须重写该方法equals(),以维护该hashCode方法的一般合同,该合同规定相等的对象必须具有相等的哈希码。

注意:有 4,294,967,296 (2^32) 个可能的 hashCode 可用,但我们创建的对象数量要大得多,因此某些对象必须共享相同的 hash Code。
参考
1参考2

于 2013-02-01T05:33:31.293 回答