arraylist 操作的运行时按索引添加和删除

Runtime of arraylist operations add and remove by index

对于Java ArrayList,在摊销常数时间内按索引运行添加和删除是否准确,这意味着平均它是常数时间(在极少数情况下通过设置线性时间内存以便将来的操作更快)?

对于 add(Object) 是的,但是对于 remove(int index) 只有当你删除最后一个元素时它才是常数时间,否则元素会移动以从中间删除任何 nulls数组的。

基于索引的 add(并从非最后位置移除)不是摊销常数时间,它们是线性时间。

不,如果说按索引从 ArrayList 中插入和删除元素是摊销常数时间是不准确的,因为复制数据没有进行摊销。

只有列表扩展及其关联的复制被摊销,因为它们很少发生*。但是,这需要在列表末尾插入。

当您在列表的开头插入时,扩展仍然会摊销,但是每次调用都会发生将元素移动 1 个位置所需的副本,并且不会摊销。

* 为了能够分摊操作成本,您需要混合使用 "cheap" 和 "expensive" 操作。在这种情况下,您可以将总成本分摊到所有操作中,从而获得较低的结果。