ArrayDeque的文档说:



没有提到使用ArrayDeque作为堆栈和使用ArrayList之间的区别。您可以按以下方式将ArrayList用作堆栈。

list.add(object);                      // push
object = list.remove(list.size() - 1); // pop

我发现仅以这种方式使用ArrayList时,其性能比ArrayDeque差。是什么造成了这种差异?当然,不能只是对size()的调用吗?在内部,ArrayListArrayDeque都是使用Object[]实现的,该ojit_code在需要时会被较大的数组替换,因此性能肯定应该差不多吗?

最佳答案

两种实现之间的主要区别在于调整大小策略

  • ArrayList调整为新的oldCapacity + (oldCapacity >> 1)大小,导致增加约50%。默认容量为10,调整后的容量为15、22、33、49、73、109、163、244、366 ...
  • ArrayDeque始终调整为2的幂。调整大小时,容量增加一倍。从默认值16开始,调整大小后的恢复容量为32、64、128、256,...

  • 因此,ArrayDeque可以通过更少的调整大小操作来达到更高的容量,这由于数组复制而非常昂贵。即要在默认大小的ArrayList中存储256个,则需要9次调整大小调用,而ArrayDeque仅需要4个。
    阵列复制可能很快,但是除了内存复制成本外(由于ArrayDeque与2的幂对齐,所以ArrayDeque的性能也可能更好),因此阵列复制可能还需要GC为新数据集释放一些空间。

    通过直接访问headtail(ArrayDequeue)分别添加和删除(最后)size(ArrayList)来进行插入和弹出操作,这两种数据结构的最佳情况复杂度均为O(1)

    关于java - ArrayDeque与ArrayList实现堆栈,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29583171/

    10-09 05:32