【问题标题】:What are ArrayList's most performance friendly methods?ArrayList 对性能最友好的方法是什么?
【发布时间】:2015-07-31 10:30:51
【问题描述】:

我需要知道以下哪个ArrayList 方法对性能最友好:

arrayList.add(index,Object)
arrayList.clear()

我的情况是,我必须选择将 1 个元素添加到非空数组列表的第一个位置,或者只清除整个数组列表。你会选择什么?

【问题讨论】:

  • 你到底想详细说明什么
  • 它们确实不是彼此的替代品,所以比较没有意义......
  • 最后2个可能在某种程度上具有可比性,但不是第一个
  • 实际使用 Big-Oh 这些都是所有可比的。

标签: java


【解决方案1】:

使用Big-Oh notation,我们可以概括ArrayList 类中方法的时间复杂度。

对于ArrayList<>,可以定义如下操作:

  • get() 的时间复杂度为 O(1)
  • add()clear()remove() 的时间复杂度均为 O(n)
  • removeAll() 的时间复杂度为 O(n^2)

由此可以看出get() 的时间复杂度最低,并且不依赖于列表的大小来执行它。您还应该注意 add()clear()remove() 都以线性时间运行 - 效率不高,但通常不会被认为对性能不利。

根据official documentation

size、isEmpty、get、set、iterator 和 listIterator 操作运行 在恒定时间内。添加操作在摊销的常数时间内运行, 也就是说,添加 n 个元素需要 O(n) 时间。所有其他 操作以线性时间运行(粗略地说)。常数因子 与 LinkedList 实现相比较低。

为什么是大哦? (source)

大 O 表示法是一种描述算法执行速度的方式 给定任意数量的输入参数运行,我们将调用 n。它在计算机科学中很有用,因为不同的机器 以不同的速度运行,简单地说算法需要 5 秒并不能告诉你太多,因为虽然你可能正在运行 具有 4.5 Ghz 多核处理器的系统,我可能运行了 15 年 旧的 800 Mhz 系统,这可能需要更长的时间,无论 算法。

因此,与其指定算法运行的速度有多快,不如说是 时间,我们用输入参数的数量来表示它的运行速度,或者n

通过以这种方式描述算法,我们可以比较 算法的速度,而不必考虑算法的速度 计算机本身。

来源:Big-Oh cheatsheetthis answer

【讨论】:

  • 检查我编辑的问题。这些动作中哪一个更有效?我最感兴趣的是 add(i, object) vs clear()
  • 只是一些澄清。你说 add() 和 clear() 的复杂度一样吗?因此,如果您要在将新对象添加到位置 0 的 add(1,Object) 和仅清除所有内容的 clear() 之间进行选择。哪个最快?
  • 请描述你真正想做的事情。这两种方法做的事情完全不同。为什么要在它们之间做出选择?
  • @ThanosF 您询问了效率,但您似乎对它的实际含义感到困惑。实际执行的速度取决于多种因素,如果您想查看在您的机器上哪个更快 - 创建一个测试程序并运行它。
  • 我会选择听长话短说,但坦率地说,我希望在性能上不会有明显的差异。
【解决方案2】:

这取决于 ArrayList 中有多少项目。最坏的情况是当有很多项目时,数组列表应该被扩展/收缩。在这种情况下,clear() 方法是最快的。其他两个涉及 System.array 将旧数组复制到新数组中。

【讨论】:

  • 所以在这种情况下使用 clear() 比 add(i,Object?) 更快
  • 是的。我想知道如何使用 clear 而不是 add?
  • 说来话长。我处于一种情况,我必须选择将 1 个元素添加到非空数组列表的第一个位置,或者只清除整个数组列表。上面的人说这两个动作在性能上没有区别,因为它们都有 O(n) 复杂度
  • 他们是对的,我也是:)。 O(n) 表示线性复杂度。这两种方法都有。如果必须扩展底层字节数组,clear 的差异为 1*n,add 的差异为 2*n。
猜你喜欢
  • 2012-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-02
  • 2012-06-01
相关资源
最近更新 更多