对这个相当天真的问题道歉,但我相信我自己的回答是天真的.我认为密钥(在HashTables中)是不可变的,因为我们不希望以某种方式意外地改变密钥,因此混乱了HashTable的排序.这是正确的解释吗?如果是这样,它怎么能更正确?
在HashTable.put
密钥被散列期间,它的值基于散列存储在多个桶(键值对列表)之一中,例如:
bucket[key.hashcode() % numberOfBuckets].add(key, value)
如果钥匙的hashcode
插入后改变它才能再在错误的桶,你会再无法找到它,并在哈希表会错误地返回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; }