为什么在 hashmap 中使用 Linkedlist?为什么不使用 List 的其他实现?
Why Linkedlist in hashmap?Why not other implementation of List?
当两个不同的键产生相同的 hashCode
时,HashMap
使用 LinkedList
。但我想知道是什么让 LinkedList
比其他 LinkedList
的实现更好=14=]。为什么不 ArrayList
因为 ArrayList
在内部使用 Array
并且 arrays
与 LinkedList
.
相比有更快的迭代
arrayList 的问题是您不能快速删除一个元素:您必须在删除的元素之后移动所有元素。
对于 linkedList,删除元素只是将引用从一个节点更改为新的下一个节点,跳过已删除的节点。
差别很大。当你想要一个列表并且能够快速删除元素时,不要使用arraylist,通常选择链表。
Why not ArrayList because ArrayList uses Array internally and arrays have a faster iteration compared to a LinkedList.
而 ArrayList
修改起来慢。所以他们做出了判断并选择了 LinkedList
.
哈希映射中的冲突是一个例外,而不是一个规则。当你的哈希函数相当好时,应该很少有冲突。
如果我们使用 ArrayList
作为桶,大多数列表都是空的或只有一个元素,这将是相当大的资源浪费。使用数组列表预先分配多个成员,您最终会为将来可能不会发生的多次冲突付出代价。
此外,只有当最后一个元素被删除时,从数组列表中删除才便宜。当第一个被删除时,您最终要为所有元素的移动付费。
链表没有这些问题。插入是 O(1),删除是 O(1),并且它们使用的节点数与您插入的节点数完全相同。 next
/prior
链接的内存开销并不算太大,可以为这种便利付出代价。
当两个不同的键产生相同的 hashCode
时,HashMap
使用 LinkedList
。但我想知道是什么让 LinkedList
比其他 LinkedList
的实现更好=14=]。为什么不 ArrayList
因为 ArrayList
在内部使用 Array
并且 arrays
与 LinkedList
.
arrayList 的问题是您不能快速删除一个元素:您必须在删除的元素之后移动所有元素。
对于 linkedList,删除元素只是将引用从一个节点更改为新的下一个节点,跳过已删除的节点。
差别很大。当你想要一个列表并且能够快速删除元素时,不要使用arraylist,通常选择链表。
Why not ArrayList because ArrayList uses Array internally and arrays have a faster iteration compared to a LinkedList.
而 ArrayList
修改起来慢。所以他们做出了判断并选择了 LinkedList
.
哈希映射中的冲突是一个例外,而不是一个规则。当你的哈希函数相当好时,应该很少有冲突。
如果我们使用 ArrayList
作为桶,大多数列表都是空的或只有一个元素,这将是相当大的资源浪费。使用数组列表预先分配多个成员,您最终会为将来可能不会发生的多次冲突付出代价。
此外,只有当最后一个元素被删除时,从数组列表中删除才便宜。当第一个被删除时,您最终要为所有元素的移动付费。
链表没有这些问题。插入是 O(1),删除是 O(1),并且它们使用的节点数与您插入的节点数完全相同。 next
/prior
链接的内存开销并不算太大,可以为这种便利付出代价。