Java如何实现哈希表?

2022-09-02 23:45:28

有谁知道Java如何实现其哈希表(HashSet或HashMap)?考虑到人们可能想要放入哈希表中的各种类型的对象,似乎很难提出一个适用于所有情况的哈希函数。


答案 1

HashMap和HashSet非常相似。实际上,第二个包含第一个实例。

HashMap 包含一个存储桶数组,以便包含其条目。数组大小始终为 2 的幂。如果未指定其他值,则最初有 16 个存储桶。

当您在其中放置一个条目(键和值)时,它会根据条目的哈希码(哈希码不是其内存地址,哈希不是模数)来计算条目将插入到的存储桶。不同的条目可能会在同一存储桶中发生冲突,因此它们将被放入列表中。

将插入条目,直到它们达到负载系数。默认情况下,此因子为 0.75,如果您不太确定正在执行的操作,则不建议更改它。0.75 作为负载因子意味着包含 16 个存储桶的 HashMap 只能包含 12 个条目 (16*0.75)。然后,将创建一个存储桶数组,其大小是上一个存储桶的两倍。所有条目将再次放入新数组中。此过程称为重新哈希,并且可能很昂贵。

因此,如果您知道将插入多少个条目,则最佳做法是构造一个指定其最终大小的哈希映射:

new HashMap(finalSize);

答案 2

例如,您可以检查HashMap的来源。