【发布时间】:2020-07-17 23:13:34
【问题描述】:
class ArrayList<E> 的 java documentation 指定:
size、isEmpty、get、set、iterator和listIterator操作在恒定时间内运行。add操作运行在摊销常数时间,即添加n 个元素需要O(n) 时间。所有其他操作都以线性时间运行(粗略地说)。与LinkedList实现相比,常数因子较低。每个
ArrayList实例都有一个容量。容量是用于存储列表中元素的数组的大小。它总是至少与列表大小一样大。随着元素被添加到ArrayList,其容量会自动增长。除了添加元素具有恒定的摊销时间成本这一事实之外,没有指定增长策略的细节。
这怎么可能?
void add(int index, E element) 方法在此列表中的指定位置插入指定元素,将所有后续元素向右移动。虽然通过使用几何增长重新分配后备数组,似乎可以实现 amortized constant time 在 ArrayList 的末尾插入 n 个元素,但这不会允许 在数组中间插入元素时的摊销常数时间。
文档是否仅提及add(element E) 方法,或者是否有一个巧妙的技巧可以在所有情况下实现摊销常数时间?
【问题讨论】:
标签: java performance arraylist