我们可以用 ArrayDeque 替换 ArrayList 以获得更好的性能吗?

Can We replace ArrayList with ArrayDeque for better performance?

我在阅读 Kathy sierra 的 OCP8 指南时发现了一行内容:

"ArrayDeque is like an ArrayList with better performance"

现在我很困惑在哪里使用ArrayList和在哪里使用ArrayDeque。 我也知道 ArrayDeque 总是被调整为 2 的幂。在调整大小时,容量加倍,所以在某些情况下这可能会影响性能。但我想知道两者之间哪个更可取。 非常感谢帮助。

我建议在以下情况下使用 ArrayList 而不是 ArrayDeque

  1. 如果您需要通过索引访问元素并且您只需要使用 ArrayList 最后需要insert/delete。
  2. 将 ArrayDeque 用作堆栈、队列或双端队列。

两个集合中的插入和删除。

数组列表:

最坏情况 O(n),因为您必须移动元素。最后的 Insertion/deletion 更快,因为要移动的元素更少。如果在Arraylist已满时插入,则必须将元素复制到一个新的更大的数组中,即O(n)。

  • 在 ArrayList 的末尾插入需要摊销常数时间。 这意味着将 n 次插入序列插入到一个最初为空的 ArrayList 的最坏情况运行时间为 O(n),因此平均运行时间 每次插入的时间复杂度为 O(1),尽管有些插入可能会更慢。这个 通过始终将数组大小增加一个常数因子来实现, 因为复制的元素总数是一个几何元素的总和 系列。

ArrayDeque:

  • 前面或后面删除都是O(1),前面或后面插入 返回需要摊销的常数时间。 JCF 实现不 允许 insertion/deletion 按索引(如果允许,它将是 最坏情况 O(n) 因为移位)。
  • 数组双端队列没有容量限制,它们会根据需要增长 支持使用。
  • 它们不是线程安全的,这意味着在 没有外部同步
  • ArrayDeque 中禁止空元素。

现在答案在你的问题中。这完全取决于您的 requirement.after 分析,您可以轻松预测。

更多请拍look