![](/img/trans.png)
[英]In Java, why is insertion or deletion in a Linked List a constant time operation? Isn't it misleading?
[英]ArrayList or Linked List - Which collection to use if both insertion/deletion and look up operation is to be performed
众所周知,链接列表用于快速插入删除,数组列表用于快速查找
我要求将10000条记录保存在列表中。 我将使用哪个集合。 查找和插入/删除操作都可以在该列表上执行。
我使用哪个收藏集,为什么? 还是我会使用自己创建的收藏集?
插入
LinkedList
首先插入-O(1)
最后插入-O(1)
在任何地方插入-O(n)-这是因为需要按索引查找要插入的位置。
ArrayList
首先插入-O(n)
最后插入-O(1)
插入到任何地方-O(n)
因此, LinkedList
和ArrayList
在任何位置都具有相同的O(n)插入。
删除
LinkedList
首先删除-O(1)
最后删除-O(1)
删除任何地方-O(n)-再次是因为需要按索引查找要删除的位置。
ArrayList
首先删除-O(n)
最后删除-O(1)
删除任何地方-O(n)
因此, LinkedList
和ArrayList
在任何位置都具有相同的O(n)删除。
如您所见,在任何地方插入和删除都是相同的。 如果您总是插入最后一个操作,则可以使用ArrayList,因为如果您知道索引,则对LinkedList的查找为O(1)和O(n)。 我认为您需要找到最适合使用的黄金中间点。
另外,如果您不关心无复制,则可以使用HashSet。 它基于哈希表,并为插入,删除和查找提供合适的性能(在许多情况下为O(1),O(log(n)))。
HashSet Jdoc
该类为基本操作(添加,删除,包含和大小)提供恒定的时间性能,假设哈希函数将元素正确地分散在存储桶中。
每当您需要选择适合您问题的数据结构时,请在下面的链接中查看这些表。
大复杂性
在不查看数据的情况下,除非您的用例涉及使用ListIterator
的大量插入和删除操作(=两端都不操作时在LinkedList
上获得O(1)
插入和删除操作的方式),否则实际性能会由于较低的开销和较少的指针解引用,建议使用ArrayList
。
在您选择时很重要的因素:
Integer
),则LinkedList
开销将更加明显。 LinkedList
每个节点至少需要2个额外的指针,每个节点的估计开销约为8个字节。 更多的内存意味着更多的高速缓存未命中和性能降低。 ArrayList
是ArrayList
的方法。 如果您在随机位置插入和删除,则ArrayList可能仍然是可行的方法(因为扫描速度更快)。 仅当您需要在开始时插入和/或始终使用ListIterator
时,您才真正从LinkedList
看到性能优势。 最后-您是否考虑过使用Set
或Map
来加快搜索和访问速度? O(n)列表访问快速总结,特别是如果您在循环内使用它。 映射和集合可以提供O(log n)
和O(1)
访问(取决于实现),以显着提高性能。
一些参考:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.