0

我想知道如果我使用原始数组然后重建它以添加这样的新元素是否存在性能差异:

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添加元素。

我不确定这就是我问的原因,它的速度是否相同,因为 ArrayList 的构建方式与我使用原始数组的方式相同,还是真的存在差异,即使我重建原始数组也总是更快每次我添加一个元素?

4

7 回答 7

5

ArrayLists 以类似的方式工作,但不是在每次达到限制时每次将容量翻倍时都重新构建。所以如果你不断地添加它,ArrayLists 会更快,因为重新创建数组相当慢。因此,如果您不经常添加它,您的实现可能会使用更少的内存,但就速度而言,大多数时候它会更慢。

于 2013-10-30T18:17:07.150 回答
2

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

于 2013-10-30T18:16:31.240 回答
1

简而言之,坚持使用ArrayList. 这是:

  • 广为人知;
  • 测试良好;
  • 可能会比您自己的实现更高效(例如,ArrayList.add()保证摊销 constant-time,而您的方法不是)。
于 2013-10-30T18:15:07.253 回答
1
  • Arrays 和 ArrayList 都没有性能问题。
  • 数组和 ArrayList 是基于索引的,因此两者的工作方式相同。
  • 如果你需要动态数组,你可以使用 arrayList。
  • 如果数组大小是静态的,则使用 Array。
于 2013-10-30T18:18:05.367 回答
0

在速度方面,您的实现可能会明显输给 Java ArrayList。您正在做的一件特别昂贵的事情是每次要添加元素时重新分配数组,而 Java 的 ArrayList 试图通过在必须重新分配之前拥有一些“缓冲区”来进行优化。

于 2013-10-30T18:16:58.007 回答
0

ArrayList 也将在内部使用 Array Only ,所以这是真的 Array 将比 ArrayList 快。在编写高性能代码时,总是使用数组。出于同样的原因,Array 是大多数集合的支柱。您必须通过集合的 JDK 实现。我们在开发一些应用程序时使用 ArrayList 并且我们不关心这些次要的性能问题,并且我们确实进行了权衡,因为我们已经编写了 API 来放置、获取、调整大小等。

于 2013-10-30T18:24:39.803 回答
0

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

于 2016-09-20T13:25:26.040 回答