【发布时间】:2016-05-24 08:58:50
【问题描述】:
您似乎将 ArrayList 用于所有目的。 Java 中还有其他列表类型比 ArrayList 更适合某些情况。你应该看看那些并试着感受一下什么时候使用哪个列表。在这种特殊情况下,即LinkedList 更好。
我也倾向于大量使用ArrayList,并且看不到选择其他列表类型背后的逻辑。
List docs 显示五个主要的 List 子类:ArrayList、CopyOnWriteArrayList、LinkedList、Stack 和 Vector。
来自ArrayList 文档,
size、isEmpty、get、set、iterator 和 listIterator 操作在恒定时间内运行。添加操作在摊销常数时间内运行,即添加 n 个元素需要 O(n) 时间。所有其他操作都以线性时间运行(粗略地说)。与 LinkedList 实现相比,常数因子较低。
这表明 ArrayList 的性能通常会优于 LinkedList(this heavily upvoted question 支持的断言),尽管 LinkedList 文档对性能没有很好的了解:
所有操作都按照双向链表的预期执行。
CopyOnWriteArrayList 似乎只对不变的列表有用,因为每次修改的完整快照对于正常使用来说似乎非常昂贵。
即使是 Stack 文档也不推荐使用它:
Deque 接口及其实现提供了一组更完整和一致的 LIFO 堆栈操作,应优先使用该类。
由于Vector 是同步的,而List 的其余子类不是同步的,所以在我看来Vector 将是线程安全环境中的最佳选择。
然而,即使在阅读了文档之后,我仍然认为我不明白 TwoThe 的答案来自哪里。 CopyOnWriteArrayList 和 Vector 似乎都有一个专门的用例,Stack 似乎不值得使用,ArrayList 似乎优于 LinkedList。
我在这里遗漏了什么,在什么情况下另一个 List 实现会优于 ArrayList?
【问题讨论】:
-
仅供参考:
Vector通常被认为已弃用,如果您需要同步功能,可以使用Collections.synchronizedList -
并不总是可以知道哪一个总是正确的(对于方法/API)。在某些情况下,您需要
ArrayList擅长的随机访问,有时您需要LinkedList擅长的串行/线性访问。通常,如果我的方法在内部使用ArrayList。我会让方法返回List,如果我想使用LinkedList,我可能会考虑返回Iterator,这会强制使用进入串行访问模式,但你并不总是知道其他人可能想要什么来自您的数据 -
对于事件触发,CopyOnWrite 几乎可以肯定是正确的实现。并发是一个大问题。读取比写入更频繁。
标签: java performance list