"assuming the hash function disperses the elements properly among the buckets" 到底是什么意思?

What does "assuming the hash function disperses the elements properly among the buckets" mean at all?

开始学习 Java,我在 Java 8 的文档中看到了这个语句:

假设哈希函数将元素适当地分散在桶中。

这是否仅仅意味着您在分配后得到的顺序会一团糟?

这意味着 HashMap 在底层维护着一个 array of buckets哈希码key 对象的 hashCode() 方法产生,决定了这个 bucket条目应该去。

当多个 keys 产生 相似的 hashes 并且因此被映射到同一个 bucket被称为碰撞.

映射到相同 bucket 的映射条目将被构造为 链表 。从 Java 8 开始,当碰撞次数在某个阈值后增长时,列表将转换为 tree.

正如您可能知道的那样,访问数组中某个索引下的元素的成本是 O(1)。并且 HashMap 以摊销的时间复杂度 O(1) 提供按键访问值,但前提是可以忽略许多冲突。 IE。 hashCode() 的实现方式允许在存储桶之间相对均匀地分布密钥。

哈希函数 执行不当的极端情况下,假设 returns 相同的 哈希 对于每个键 所有条目最终都在 相同的桶 中。 get()containsKey() 等方法的时间复杂度降低到 O(n)Java 7 及更早版本),因为您必须遍历所有条目的 list 才能找到特定条目。从 Java 8 开始,时间复杂度将是 O(log n) 因为这是找到一个元素所需的更糟糕的时间在 red-black 树中 .

Does that simply mean that the order you get, after assigning, will be a mess?

HashMap 中元素的顺序未定义。当您需要快速访问并且不关心顺序时,此 class 很有用。如果需要有序映射,请考虑 LinkedHashMap,它通过维护链表来跟踪条目添加到映射的顺序,或者 TreeMap 根据它们的自然顺序或基于给定的比较器对键进行排序.

一个散列映射包含多个“桶”。为了获得最佳性能,您希望每个存储桶中的条目数大致相同。桶由哈希函数确定;因此,您需要一个哈希函数,它或多或少会导致命中每个桶的概率相同。也就是说,“哈希函数将元素适当地分散在桶中”。

另一个极端:总是返回值 3 的散列函数可以工作,但映射访问效率不是很高,因为一个桶将包​​含所有条目。

我不明白你所说的订单“一团糟”是什么意思。散列映射是无序的;元素的位置取决于其哈希码。