首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java哈希表的哈希

java哈希表的哈希
EN

Stack Overflow用户
提问于 2010-01-12 10:47:06
回答 5查看 352关注 0票数 1

java Hashtable元素的hashCode是否总是唯一的?

如果不是,我怎么保证一次搜索就能给出正确的元素呢?

EN

回答 5

Stack Overflow用户

发布于 2010-01-12 10:48:15

不一定。两个不同的(且不相等的)对象可以有相同的哈希码。

票数 5
EN

Stack Overflow用户

发布于 2010-01-12 10:51:40

从Java documentation

hashCode的总合同是:

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

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

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

在合理的实际情况下,Object类定义的hashCode方法确实会为不同的对象返回不同的整数。(这通常是通过将对象的内部地址转换为整数来实现的,但JavaTM编程语言不需要这种实现技术。)

因此,是的,您通常可以期望对象的默认hashCode是唯一的。但是,如果该方法已被存储在Hashtable中的类覆盖,则所有赌注都将失效。

票数 1
EN

Stack Overflow用户

发布于 2010-01-12 11:13:13

首先要做的是。

您应该考虑使用HashMap而不是Hashtable,因为后者被认为是过时的(它强制执行隐式同步,这在大多数情况下并不是必需的。如果您需要一个同步的HashMap,这很容易做到)

现在,关于你的问题。

不保证哈希码在数学上是唯一的,

但是,当您使用HashMap (或Hashtable)时,这并不重要。

如果两个键生成相同的散列代码,则会在每个键上自动调用equals,以保证检索到正确的对象。

如果你使用字符串作为你的密钥,你就不用担心了,

但是,如果您使用自己的对象作为键,则应该覆盖equals和hashCode方法。

对于HashMap的正确操作,equals方法是必需的,而hashCode方法的编码应该使得哈希表相对稀疏(否则您的哈希图将只是一个很长的数组)

如果你正在使用Eclipse,有一种简单的方法来生成hashCode和equals,它基本上为你做了所有的工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2046375

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档