ArrayDeque
的文档说:
没有提到使用ArrayDeque
作为堆栈和使用ArrayList
之间的区别。您可以按以下方式将ArrayList
用作堆栈。
list.add(object); // push
object = list.remove(list.size() - 1); // pop
我发现仅以这种方式使用
ArrayList
时,其性能比ArrayDeque
差。是什么造成了这种差异?当然,不能只是对size()
的调用吗?在内部,ArrayList
和ArrayDeque
都是使用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为新数据集释放一些空间。
通过直接访问
head
和tail
(ArrayDequeue)分别添加和删除(最后)size
(ArrayList)来进行插入和弹出操作,这两种数据结构的最佳情况复杂度均为O(1)关于java - ArrayDeque与ArrayList实现堆栈,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29583171/