我们可以用 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
- 如果您需要通过索引访问元素并且您只需要使用 ArrayList
最后需要insert/delete。
- 将 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
我在阅读 Kathy sierra 的 OCP8 指南时发现了一行内容:
"ArrayDeque is like an ArrayList with better performance"
现在我很困惑在哪里使用ArrayList
和在哪里使用ArrayDeque
。
我也知道 ArrayDeque 总是被调整为 2 的幂。在调整大小时,容量加倍,所以在某些情况下这可能会影响性能。但我想知道两者之间哪个更可取。
非常感谢帮助。
我建议在以下情况下使用 ArrayList 而不是 ArrayDeque
- 如果您需要通过索引访问元素并且您只需要使用 ArrayList 最后需要insert/delete。
- 将 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