Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 数组是否比arraylist快?_Java_Arrays_Performance_Arraylist - Fatal编程技术网

Java 数组是否比arraylist快?

Java 数组是否比arraylist快?,java,arrays,performance,arraylist,Java,Arrays,Performance,Arraylist,我的直觉是数组比arraylist快,因为arraylist是使用数组实现的,数组在填充/丢失元素时会调整大小 我只是想确认这是否属实,这意味着如果您知道要保存的元素数量,就没有理由使用arraylist。任何性能差异都可以忽略不计。以任何方式编写代码,使其最具可读性和可维护性,并且尽量不要优化类似的内容,除非您通过测试确定您从中获得了显著的性能影响 使用ArrayList的潜在原因: 有用的方法(包含等) 实现了Iterable、Collection和List,因此可以在许多基于接口的API

我的直觉是数组比arraylist快,因为arraylist是使用数组实现的,数组在填充/丢失元素时会调整大小


我只是想确认这是否属实,这意味着如果您知道要保存的元素数量,就没有理由使用arraylist。

任何性能差异都可以忽略不计。以任何方式编写代码,使其最具可读性和可维护性,并且尽量不要优化类似的内容,除非您通过测试确定您从中获得了显著的性能影响

使用
ArrayList的潜在原因

  • 有用的方法(
    包含
    等)
  • 实现了
    Iterable
    Collection
    List
    ,因此可以在许多基于接口的API调用中使用
  • 尽管您目前“知道”您的收藏规模永远不会改变,但生活对我们提出了意想不到的要求。当没有明显的优势可以获得时,为什么要把自己锁定在一个模式中呢

    • 您不应该过早地优化代码,而应该使用最适合您的代码的数据结构。 正如你所说,经验法则可以是:

    • 我不知道元素的数量,或者它正在改变很多=>List(不要专注于实现)

    • 元素的数量在已知的=>数组中是固定的


    • 如果您知道阵列的大小,请确保它不会膨胀或收缩。而不是使用数组。如果您不知道,数组列表更可取且稳定。对于性能,这是您唯一关心的问题吗?向前移动..

      是的,阵列速度要快得多。如果您运行数值算法,您可以看到明显的加速


      然而,对于正常的应用程序,您不必担心它。这是因为运行时的大部分时间都花在了做其他事情上。

      ArrayList
      在简单的get/set上不能更快,但差异非常小,在几乎任何现实场景中都不值得担心


      List
      API有一些您可能需要的方法,即使您已经知道大小是固定的。例如,想想
      contains()
      。如果您需要一个
      迭代器
      或者一个API需要一个
      列表
      ,那么您还必须使用
      ArrayList
      ——即使您知道列表的大小是固定的。

      ArrayList为您提供了许多原始数组所没有的特性。如果知道元素的数量,可以创建该大小的ArrayList

      new ArrayList<String>(100);
      
      newarraylist(100);
      
      如果您担心ArrayList和array之间的速度差异,那么您担心的是错误的事情。它不太可能成为代码中的瓶颈。如果是的话,几乎可以肯定有一个比改用数组更好的答案


      不要屈服于过早的优化。这将对您的代码造成严重破坏。大多数事情都不重要,只有少数事情重要。只有通过分析代码才能找到这几样东西。试图让每个部分都快起来是让整个过程快起来的一种非常无效的方法。保持干净、简单的设计更有效。这将为您提供必要的接口,以便在实际需要的一两个地方引入优化。

      正如其他人已经说过的,使用ArrayList,除非性能基准表明它是一个瓶颈

      是的,由于访问器开销,存在性能差异,这在一般情况下并不显著。一般规则的一个例外是,如果要在ArrayList中存储基元类型。当它将对象转换为对象和基元类型时,这将对性能产生重大影响

      // easier to work with but slow
      ArrayList<Double> slowList;
      
      // faster primitive data array
      double[] fasterList;
      
      //使用起来更容易,但速度较慢
      ArrayList slowList;
      //更快的原始数据数组
      双[]快速列表;
      
      数组比数组列表快得多。差异可能是数百%,可能来自JVM优化。如果您将数组变量声明为volatile,您将获得类似的性能。

      如果您可以保证这一点,出于性能原因,您可以继续使用数组。但是,我只会在您知道这是一个性能瓶颈的情况下这样做,因为这会降低代码的灵活性。过早优化是万恶之源。我不认为过早优化的经验法则适用于API更改decisions@aetheria该规则适用于黑箱函数体,其中优化不会影响程序的其他部分,因此,您只能从优化中获益,同时拥有一个可以配置的工作程序。在API中,虽然您仍然可以从分析数据中获益,但优化可能会影响程序的其他部分。例如,如果他有一个返回数组`ArrayList,他想切换,他必须更改使用该函数的代码,如果该代码返回数组`ArrayList,他必须更改使用该代码的代码,依此类推;如果没有大量的分析数据和强大的业务案例,就不能为了优化而牺牲API的可用性。即使这样,也几乎可以肯定有更好的方法来解决这种情况——例如,以“告诉,不要问”的方式设计API,从而使这些实现决策更加隐蔽。这并不是说数组不容易使用。如果他们提高了API的可用性,那就好了。在我看来,如果您纯粹为了优化而使用它们,并因此使API更难使用,那么这是一个糟糕的举动。@aetheria大多数体面的语言都允许隐藏实现细节,这是更好的选择。但我们谈论的不是体面的语言——我们在这里谈论的是Java。在Java中,数组不与更复杂的集合(如C#)共享接口,泛型不足以同时处理数组和
      ArrayList
      (如