【发布时间】:2011-01-04 00:28:40
【问题描述】:
java Hashtable 元素的 hashCode 总是唯一的?
如果不是,我如何保证一次搜索就能找到正确的元素?
【问题讨论】:
java Hashtable 元素的 hashCode 总是唯一的?
如果不是,我如何保证一次搜索就能找到正确的元素?
【问题讨论】:
不一定。两个不同(且不相等)的对象可以具有相同的哈希码。
【讨论】:
第一件事。
您应该考虑使用 HashMap 而不是 Hashtable,因为后者被认为已过时(它强制执行隐式同步,大多数情况下不需要。如果您需要同步的 HashMap,这很容易实现)
现在,关于您的问题。
不保证哈希码在数学上是唯一的,
但是,当您使用 HashMap(或 Hashtable)时,这并不重要。
如果两个键生成相同的哈希码,则会在每个键上自动调用 equals 以确保检索到正确的对象。
如果您使用字符串作为键,则放心,
但如果您使用自己的对象作为键,则应覆盖 equals 和 hashCode 方法。
equals 方法对于正确操作 HashMap 是必需的,而 hashCode 方法应编码为使得哈希表相对稀疏(否则您的哈希图将只是一个长数组)
如果您使用的是 Eclipse,有一种简单的方法可以生成 hashCode 和 equals,它基本上可以为您完成所有工作。
【讨论】:
来自Javadocumentation:
hashCode的一般合约是:
每当在同一对象上多次调用它时 执行 Java 应用程序时,hashCode 方法必须一致 返回相同的整数,前提是在 equals 比较中未使用任何信息 对对象进行修改。这个整数不需要保持一致 从应用程序的一次执行到同一应用程序的另一次执行 应用。
如果两个对象根据equals(Object)相等 方法,然后必须对两个对象中的每一个调用 hashCode 方法 产生相同的整数结果。
如果两个对象不相等,则不需要 equals(java.lang.Object) 方法,然后在每个上调用 hashCode 方法 这两个对象必须产生不同的整数结果。然而 程序员应该知道产生不同的整数结果 不相等的对象可能会提高哈希表的性能。
在合理可行的情况下, 类定义的 hashCode 方法 对象确实返回不同的整数 对于不同的对象。 (这是 通常通过转换实现 对象的内部地址 成一个整数,但这 实现技术不是 JavaTM 编程要求 语言。)
所以是的,您通常可以期望 Object 的默认 hashCode 是唯一的。但是,如果该方法已被您存储在 Hashtable 中的类覆盖,则所有赌注都将关闭。
【讨论】:
理想情况下,是的。实际上,碰撞确实偶尔会发生。
【讨论】:
java Hashtable 元素的 hashCode 总是唯一的?
他们应该。至少在同一个班级。
如果不是,我如何保证一次搜索就能找到正确的元素?
通过为您的班级指定一个好的hasCode 实现:Override equals() and hashCode
【讨论】: