Java Hashtable #hashCode()实现坏了吗?

时间:2012-03-19 19:18:35

标签: java hashtable hashcode

我想知道当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实际上已更改。密钥和值是否相同无关紧要。

3 个答案:

答案 0 :(得分:6)

来自hashCode;

的文档
  

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

换句话说,执行不好 - 也许吧。破碎 - 不符合规范。

答案 1 :(得分:5)

它没有被破坏,它按照设计和广告进行工作。两个Map s相等的哈希码不需要两个Map s相等。

答案 2 :(得分:1)

hashCode的唯一要求是,如果两个对象相等,则它们的哈希码必须相等。因此

public int hashCode() {
    return 123;
}

完全有效,但并非最佳。