【问题标题】:Performance primitive Array vs ArrayList性能原语 Array 与 ArrayList
【发布时间】:2013-11-10 12:38:41
【问题描述】:

我想知道如果我使用原始数组然后重建它以添加新元素,性能是否会有所不同:

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;
}

或者如果我只使用 ArrayListadd 元素。

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

【问题讨论】:

  • 当您已经完成了经过良好测试的实现,为什么还要实现自己的?
  • 这只是关于性能我问自己是否可以使用原始类型来改进它
  • 这将非常容易实现这两种解决方案并运行基准测试来比较两者之间的速度。
  • 请修正第一条语句。

标签: java arrays performance arraylist


【解决方案1】:

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

【讨论】:

    【解决方案2】:
    • Arrays 和 ArrayList 都没有性能问题。
    • Arrays 和 ArrayList 是基于索引的,因此两者的工作方式相同。
    • 如果您需要动态数组,您可以使用 arrayList。
    • 如果 Array 大小是静态的,则使用 Array。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 感谢您的回答清楚地说明了为什么 ArrayList 是更好的解决方案(通常来说),但是如果我知道我的数组将在最小和最大大小之间的范围内,我可以改进如果我分配固定数量的元素(例如 100),如果数组处于其最大大小,性能?
        • 如果你的范围非常紧,是的。但对于 100 号的范围。使用新的实现,您将不得不调整 100 倍的大小,这将非常昂贵。您可以告诉 ArrayList 从 100 的大小开始,因此只需调整一次大小即可达到 200 的大小。
        • @Nickolaus:正确的解决方案是使用其他构造函数创建一个预先确定大小的ArrayList
        • 1.上面的实现只是手工编写的它不在我的代码中它应该只是我的意思的一个快速示例
        • 2.如果我有一个预先调整大小的 ArrayList,则大小仍然会加倍并且不会被固定值扩展
        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

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

            • 广为人知;
            • 测试良好;
            • 可能会比您自己的实现更高效(例如,ArrayList.add() 保证为 amortised constant-time,而您的方法则不是)。

            【讨论】:

              猜你喜欢
              • 2013-10-23
              • 2013-04-23
              • 1970-01-01
              • 2015-07-27
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-10-02
              相关资源
              最近更新 更多