Java:ArrayList add() 和 remove() 性能、实现?

标签 java performance collections arraylist

我在某处读到 ArrayList 的 add()remove() 操作在“摊销常数”时间内运行。这到底是什么意思?

add(item) 的实现中,我可以看到它 ArrayList 使用了一个数组缓冲区,它最多是列表大小的 3/2,如果它已满,< em>System.arraycopy() 被调用,它应该在 O(n) 内执行,而不是 O(1) 时间。那么 System.arraycopy 是否尝试做一些比将元素一个一个地复制到新创建的数组中更聪明的事情,因为时间实际上是 O(1)?


结论:add(item) 在分摊常数时间内运行,但 add(item, index)remove(index) 不t,它们以线性时间运行(如答案中所述)。

最佳答案

I have read somewhere that ArrayList's add() and remove() operations run in "amortized constant" time.

我认为 remove() 不是这样,除非在异常情况下。

  • 对随机元素的 remove(Object) 调用平均必须对列表中的一半条目调用 equals,然后复制引用另一半。

  • 对随机元素的 remove(int) 调用平均必须复制一半元素的引用。

remove(...) 平均O(1) 的唯一情况(例如摊销)是当您使用 remove (int) 从列表末尾删除一些常量偏移量的元素。

关于Java:ArrayList add() 和 remove() 性能、实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7910283/

相关文章:

java - Java I/O 程序中的 Try-Catch block 出现问题

java - 多线程中的静态方法

Native System 与 Docker 容器的性能对比

java - guava的ImmutableXXX真的是不可变的吗?

javascript - 如何在 javascript 中创建动态映射键?

java - 如何在我的 hibernate 类中启用 c3p0 日志记录

java - java中是否可以从对象中删除属性(变量)?

Python request.get 图片 - 太长 - 性能不佳

c++ - 实现上的巨大差异?

c# - 存储在集合中的 IDisposable 对象是否应该手动处理?