java – 如何选择正确的List实现?
从
this CodeReview answer,
我也倾向于使用相当大的ArrayList,并且没有看到选择其他列表类型的逻辑.
从ArrayList文档中,
这表明ArrayList通常会胜过LinkedList(this heavily upvoted question支持的断言),尽管LinkedList文档并不能很好地理解性能:
CopyOnWriteArrayList对于不变的列表似乎很有用,因为对于正常使用,每次修改的完整快照看起来都非常昂贵. 即使是堆栈文档也不建议使用它:
由于Vector是同步的而其余的List子类不同步,因此在我看来,Vector将是线程安全环境中的最佳选择. 然而,即使在阅读了文档之后,我仍然认为我不明白TwoThe的答案来自哪里. CopyOnWriteArrayList和Vector每个似乎都有一个专门的用例,Stack似乎不值得使用,而ArrayList似乎优于LinkedList. 我在这里缺少什么,在什么情况下,另一个List实现优于ArrayList? 解决方法
我同意ArrayList是许多用途的正确选择. LinkedList每个元素使用8或16字节的内存用于指针,索引是O(长度),如你所说.
那么LinkedLists的优势是什么? >迭代期间删除remove()是常量时间.使用ArrayList,它是O(长度). 至于其他人,Vector可以追溯到Java的早期阶段.这是线程安全的.因为这会增加每个操作的成本,所以它的使用或多或少地被弃用而不利于ArrayList.当您需要线程安全时,可以使用ArrayList周围的SynchronizedList包装器.类似地,Stack或多或少被弃用,以支持更现代而非线程安全的Deque. CopyOnWriteArrayList是一个线程安全的数据列表,它通过在任何元素更改时随时制作完整数组副本的一些不寻常的措施来获得安全性.虽然这听起来很疯狂,但是如果有许多线程在同一个数组上进行迭代是有意义的,因为更改不必等待迭代全部完成,而其他并发列表通常就是这种情况. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |