Java 为什么Linkedlist在hashmap中?为什么列表的其他实现不存在?
当两个不同的键产生相同的Java 为什么Linkedlist在hashmap中?为什么列表的其他实现不存在?,java,arrays,linked-list,hashmap,Java,Arrays,Linked List,Hashmap,当两个不同的键产生相同的hashCode时,HashMap使用LinkedList。但是我想知道是什么使得LinkedList比List的其他实现更好。为什么不ArrayList因为ArrayList在内部和外部使用Array数组的迭代速度比链接列表更快数组列表的问题在于无法快速删除元素:必须在删除元素之后移动所有元素 对于linkedList,删除元素只是将引用从一个节点更改为新的下一个节点,跳过删除的节点 差别是巨大的。当您想要有一个列表并能够快速删除元素时,不要使用arraylist,通常
hashCode
时,HashMap
使用LinkedList
。但是我想知道是什么使得LinkedList
比List
的其他实现更好。为什么不ArrayList
因为ArrayList
在内部和外部使用Array
数组
的迭代速度比链接列表
更快数组列表的问题在于无法快速删除元素:必须在删除元素之后移动所有元素
对于linkedList,删除元素只是将引用从一个节点更改为新的下一个节点,跳过删除的节点
差别是巨大的。当您想要有一个列表并能够快速删除元素时,不要使用arraylist,通常的选择是链表
为什么不使用ArrayList呢?因为ArrayList在内部使用数组,与LinkedList相比,数组的迭代速度更快
而且
ArrayList
的修改速度要慢得多。因此,他们做出了判断,并使用了LinkedList
哈希映射中的冲突是一个例外,而不是一个规则。当您的散列函数相当好时,应该很少发生冲突
如果我们对bucket使用ArrayList
,而大多数列表都是空的或只有一个元素,这将是一个相当大的资源浪费。由于数组列表预先分配了多个成员,您最终将为将来可能不会发生的多个冲突支付费用
此外,只有当最后一个元素被删除时,从数组列表中删除才便宜。当第一个元素被删除时,您将为所有元素的移动支付费用
链表没有这些问题。插入为O(1),删除为O(1),它们使用的节点数与插入的节点数完全相同。
next
/previor
链接的内存开销并不是为了方便而付出的太大代价。哦,我完全忽略了删除部分。感谢您的回答…:)当然,您可以通过使用删除占位符在基于数组的结构中简化删除,但这是有代价的:插入变为O(n)。你也可以避免,但这也是有代价的:浪费更多的空间。这个故事的寓意是没有什么是免费的。为什么不使用AVL树而不是链表呢?AVL树的最坏情况查找、插入和删除时间为log(n),而不是链表的O(n)最坏情况查找。我知道AVL树并不是必需的,因为数据不需要排序,但它们不是更有效吗?