对于这个相当幼稚的问题表示歉意,但是我相信我自己的回答是幼稚的。我认为(在HashTables中)键是不可变的,因为我们不想以某种方式意外更改键,因此会弄乱HashTable的排序。这是正确的解释吗?如果是这样,怎么会更正确呢?

最佳答案

HashTable.put期间,将对 key 进行哈希处理,并根据哈希将其值存储在多个存储桶(是键值对的列表)之一中,例如:

bucket[key.hashcode() % numberOfBuckets].add(key, value)

如果 key 的hashcode在插入后发生更改,则它可能位于错误的存储桶中,因此您将无法找到它,并且哈希表会在该 key 的任何null上错误地返回get

另外:了解哈希表的内部工作原理有助于您了解键对质量hashcode函数的重要性。由于较差的哈希码功能可能会导致存储桶中的键分布不佳。而且由于存储桶只是列表,因此会导致很多线性搜索,从而大大降低了哈希表的有效性。例如这个糟糕的哈希码函数将所有内容都放在一个存储桶中,因此实际上只是一个列表。
public int hashcode { return 42; /*terrible hashcode example, don't use!*/ }

这也是为什么质数出现在良好的哈希码函数中的原因之一,例如:
public int hashcode {
    int hash = field1.hashcode();
    hash = hash*31 + field2.hashcode(); //note the prime 31
    hash = hash*31 + field3.hashcode();
    return hash;
}

关于java - 为什么键在Java中是不变的?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34060994/

10-09 09:09