我想知道当Hashtable#hashCode()
仅包含每对具有相同键和值的条目时,Java的Hashtable
的默认实现是否被破坏。
请参阅以下应用程序:
public class HashtableHash {
public static void main(final String[] args) {
final Hashtable<String, String> ht = new Hashtable<String, String>();
final int h1 = ht.hashCode();
System.out.println(h1); // output is 0
ht.put("Test", "Test");
final int h2 = ht.hashCode();
System.out.println(h2); // output is 0 ?!?
// Hashtable#hashCode() uses this algorithm to calculate hash code
// of every element:
//
// h += e.key.hashCode() ^ e.value.hashCode()
//
// The result of XOR on identical hash codes is always 0
// (because all bits are equal)
ht.put("Test2", "Hello world");
final int h3 = ht.hashCode();
System.out.println(h3); // output is some hash code
}
}
空Hashtable的哈希码为0.在将密钥"Test"
和值"Test"
添加到Hastable的条目后,哈希码仍然为0
问题在于,在Hashtable的hashCode()
方法中,计算每个条目的哈希码并将其添加到哈希码中,如下所示
h += e.key.hashCode() ^ e.value.hashCode()
但是,相同哈希码的XOR
(相同字符串的情况)始终为0.因此具有相同键和值的条目不是Hashtable哈希码的一部分。
此实现 imho 已损坏,因为Hashtable实际上已更改。密钥和值是否相同无关紧要。
答案 0 :(得分:6)
来自hashCode;
的文档不要求如果两个对象根据不相等而不相等 equals(java.lang.Object)方法,然后调用hashCode方法 两个对象中的每一个都必须产生不同的整数结果。 但是,程序员应该意识到产生了不同的 不等对象的整数结果可以提高性能 哈希表。
换句话说,执行不好 - 也许吧。破碎 - 不符合规范。
答案 1 :(得分:5)
它没有被破坏,它按照设计和广告进行工作。两个Map
s相等的哈希码不需要两个Map
s相等。
答案 2 :(得分:1)
hashCode
的唯一要求是,如果两个对象相等,则它们的哈希码必须相等。因此
public int hashCode() {
return 123;
}
完全有效,但并非最佳。