arrays的好处

正如我所看到的,列表相对于数组的优势非常明显:

  • generics提供更精确的输入: List, List, List List, List, List List, List, List
  • List接口有一堆有用的方法: addAllremove等。对于数组,除了get / set之外的所有标准操作必须通过将它传递给静态方法以过程方式执行。
  • 集合提供不同的实现,如ArrayListLinkedList ,unmodifieable和synchronized列表,可以隐藏在公共List接口下。
  • OOB长度控制。

作为缺点,我只能提到没有语法糖和运行时类型检查。 同时支持两种结构需要频繁使用asListtoArray方法,这使得代码的可读性降低。 所以我很好奇使用我想念的数组有什么重要的好处。

在处理时间和内存占用方面,arrays更有效。 如果您对基本类型(如intlong进行操作,则这尤其适用,因为List要求所有元素都包装在Object (例如IntegerLong )中。 虽然Java 5引入的自动装箱function减少了此类打包和解包所需的代码量,但它并未消除性能问题,因为仍在创建包装器对象。

但是,大多数应用程序可能没有与这些问题相关的任何性能瓶颈,因此在大多数情况下, List和其他集合应该可以正常运行。 在这些情况下,编程的简易性超过了内存或CPU使用量的增加,而List是正确的选择。

如果您的列表不经常更改,列表会为您永远不会使用的对象添加许多额外的权重。 当您尝试运行需要优化的内容时,这很有帮助。 这个额外的重量也会比只使用数组更慢。 但是,除非您知道需要获得数组给出的增益,否则您应该只使用列表。

我在这里没有提到的一件事:数组可以有N个维度,而列表只能有一个。 您可以使用列表列表,但语法( List> )比[] []麻烦得多

速度。 集合比简单数组慢一些:内部大多数仍然使用数组,但在这些数组周围有额外的代码层。 当然,除非您特别需要额外的性能,否则仍应使用集合。

数组的另一个小优点是使用数组调用可变方法可能更容易。 这应该永远不是一个选择一个的主要原因。

如果使用我想念的数组有什么重要的好处?

持续访问具有非常小常量的任何元素 。 要安全地访问数组元素只需要几条指令:几个加载,一个比较和一个分支。 该分支通常几乎100%的时间都是成功的,因此现代硬件在预测它方面做得很好。

我想理论上的答案是数组应该具有更好的性能,因为通用集合具有额外的抽象层。 就个人而言,在商业应用程序中,我发现使用Arrays而非generics集合的价值非常小。

除了其他响应之外,还有一个微妙的数组属性可以被认为是优于列表的优势。 它可以通过以下代码说明:

 //This works Integer[] ints = new Integer[4]; Number[] nums = ints; //This doesn't work List intList = new ArrayList(); List numList = intList; //Does not compile List numList2 = (List)intList; //Does not compile either 

虽然子类的数组是超类的数组,但是子类列表不是超类的列表(并且有充分的理由 – 如果允许的话,generics将具有类型更安全的缺陷)。

在以下情况下,数组更好:

  • 你知道你将使用数组中固定数量的元素
  • 您不需要更改数组的大小

数组是:

  • 比任何collections都快

与Array类似的集合:

  • ArrayList – 快速读取并添加到List的末尾。 使用内部数组。 如果你必须增加List的大小,请慢一点
  • LinkedList – 快速添加到List两侧。 快速动态大小增加/减少。 不使用内部数组

结论:

我建议使用适合您的方案集合。 不要为Array []addAll() ,因为Collections包提供了非常舒服的API,如add()addAll()等。


参考:你可以在这里找到更详细的比较 – > “Arrays vs ArrayList vs LinkedList vs …”

这取决于具体情况。 数组非常快,但它们是固定大小的,如果您需要处理的数据量非常大,它们可能不适合。 另一方面,集合具有不同程度的性能,具体取决于特定的子类。 例如,ArrayList主要只是一个数组的包装器,因此应具有类似的迭代速度和内存要求。 对于我自己,我通常尽可能使用Iterable 接口,因为这为我的代码提供了最大的灵活性,允许它处理内存驻留arrays以及从文件或网络中获取的数据列表使用自定义的iterable / iterator类。 什么时候实际实例化我传入的Iterable对象,这取决于具体情况; 如果我知道它的大小并且它会立即适合内存,那么我只是使用一个数组,如果它可能会增长,那么我将使用一个ArrayList,如果它需要在两端快速插入,那么我将使用一个LinkedList的。