2013-10-30 27 views
0

我想知道是否有性能上的区别,如果我使用一个原始数组,然后重建它添加新元素是这样的:
性能基本数组VS ArrayList的

AnyClass[] elements = new AnyClass[0]; 

public void addElement(AnyClass e) { 
    AnyClass[] temp = new AnyClass[elements.length + 1]; 
    for (int i = 0; i < elements.length; i++) { 
     temp[i] = elements[i]; 
    } 
    temp[elements.length] = e; 
    elements = temp; 
} 

,或者如果我只是用一个ArrayList and add的元素。

我不确定这就是为什么我问,速度是否相同,因为ArrayList的构建方式与我对基元数组所做的相同,或者确实存在差异,并且基本数组总是更快即使我每次添加元素时都重建它?

+1

当你有很好的测试实现,你为什么要实现自己的? – kosa

+0

它只是表现我问我自己是否可以使用原始类型改进它 – Nickolaus

+0

这将非常容易实现这两种解决方案并运行基准测试,比较两者之间的速度。 – ricksuggs

回答

4

ArrayLists以类似的方式工作,但每次达到限制时每次都会增加容量,而不是重新构建。所以如果你不断加入它,ArrayLists会更快,因为重新创建数组相当缓慢。 因此,如果您不经常添加内存,您的实现可能会使用较少的内存,但只要速度变慢,大部分时间内它会变得更慢。

+0

谢谢你的回答,它很清楚为什么ArrayList是更好的解决方案(通常所说的),但如果我知道我的数组将在最小和最大大小之间的范围内,我可以提高性能,如果我分配一个固定数量的元素(例如100),如果阵列的最大尺寸? – Nickolaus

+0

如果你的范围非常紧张是的。但是对于100的范围没有。随着新的实施,你将不得不重新调整100次,这将是非常昂贵的。你可以告诉ArrayList以100的大小开始,所以它只需调整一次即可达到200的大小。 – Todoy

+2

@Nickolaus:正确的解决方案是使用其他构造函数创建预定义的'ArrayList' 。 – maaartinus

1

简而言之,坚持ArrayList。它是:

  • 广为人知;
  • 经过充分测试;
  • 可能会更高性能,您自己的实现(例如,ArrayList.add()保证是amortised constant-time,您的方法不是)。
2

当一个ArrayList调整大小时,它自身加倍,这样你就不会浪费时间调整每次的大小。分期付款,这意味着它不需要任何时间调整大小。这就是为什么你不应该浪费时间重新创造轮子。创建第一个人的人已经学会了如何提高效率,并且比平台更了解平台。

0

就速度而言,您的实现很可能会明显失去Java的ArrayList。你所做的一件特别昂贵的事情是每当你想添加元素时重新分配数组,而Java的ArrayList在重新分配之前试图通过一些“缓冲区”进行优化。

1
  • 在数组和ArrayList中都没有性能问题。
  • 数组和ArrayList是基于索引的,所以两者都以相同的方式工作。
  • 如果你需要动态数组,你可以使用arrayList。
  • 如果数组大小是静态的,则使用Array。
0

ArrayList也将在内部使用Array Only,所以这是真的Array将比ArrayList快。编写高性能代码时总是使用Array。出于同样的原因,Array对于大多数集合而言都是骨干的。 您必须通过Collections的JDK实现。 我们使用的时候我们正在开发一些应用ArrayList和我们不关心这样小的性能问题,我们也进行权衡,因为我们已经得到书面API投入,获取,调整等

0

语境是非常重要的:我的意思是如果您不断插入新项目/元素ArrayList肯定会比Array更快。另一方面,如果您只想访问已知位置上的元素 - 例如arrayItems[8]ArrayArrayList.get(8)更快;正弦有get()函数调用开销和其他步骤和检查。