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