什么是ArrayList最具性能友好的方法?

时间:2015-05-19 14:18:42

标签: java

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

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

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

2 个答案:

答案 0 :(得分:1)

这取决于ArrayList中的项目如何。最糟糕的情况是,有很多项目,数组列表应该扩展/缩小。在这种情况下,clear()方法是最快的。另外2个涉及System.arrayCopy旧数组到新数组。

答案 1 :(得分:0)

使用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

  

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

     

因此,而不是指定算法运行的速度   时间,我们说它在输入参数n的数量方面运行的速度有多快。

     

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

来源:Big-Oh cheatsheetthis answer