【发布时间】:2019-03-18 03:21:51
【问题描述】:
HashSet 中 LinkedList 的最大大小是多少?当达到最大大小时会发生什么(如果有)?如果所有 n 个输入元素都具有将值存储在哈希映射的同一节点数组中的哈希码。即当由于特定的输入,桶 0 继续增长而其余的桶未填充时会发生什么。在这种情况下是否进行了重新散列或者是否有特定的方法来避免这个问题?
【问题讨论】:
-
在 Java 无限制。在 Java 8+ 中,链表将被转换为平衡树,尽管即使在那里,它实际上也可能是一个无限链表。
-
@Andreas ,那么它如何在无限链表中获取 O(1) 中的元素?
-
它实际上是 amortized
O(1),在树内搜索时你仍然会得到O(logn) -
它没有,不是真的。但是在足够的散列函数下,散列桶碰撞的概率足够小,摊销复杂度可以被认为是O(1)。使用非常糟糕的哈希函数,所有对象可能最终都在同一个桶中,复杂度将是 O(n)。但是,对于散列集合,我们假设有足够的散列函数,因此 O(1),否则我们不会使用它们。
-
那是一个链表而不是
LinkedList。真正的问题不是糟糕的散列函数,而是恶意选择的键(或HashSet的元素)。仅当所有键都正确实现Comparable时才有效。
标签: java hashmap hashtable hashset hashcode