阵列的好处

时间:2010-05-16 13:31:04

标签: java arrays list arraylist

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

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

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

9 个答案:

答案 0 :(得分:20)

在处理时间和内存占用方面,阵列都更有效。如果您使用原始类型(例如intlong),这尤其适用,因为List要求所有元素都包含在Object中(例如{{1} }或Integer)。虽然Java 5引入的自动装箱功能减少了这种包装和解包所需的代码量,但它并没有消除性能问题,因为仍在创建包装器对象。

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

答案 1 :(得分:12)

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

答案 2 :(得分:7)

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

更麻烦

答案 3 :(得分:5)

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

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

答案 4 :(得分:4)

  

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

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

答案 5 :(得分:2)

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

答案 6 :(得分:2)

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

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

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

答案 7 :(得分:1)

在以下情况下阵列更好:

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

阵列是:

  • 比任何Collection
  • 更快

类似于Array的集合:

  • ArrayList - 快速阅读并添加到List的末尾。使用内部数组。如果您必须增加List
  • 的大小,请放慢速度
  • LinkedList - 快速添加到List的两边。快速动态大小增加/减少。不使用内部数组

结论:

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


参考: 你可以在这里找到更详细的比较 - &gt; "Arrays vs ArrayList vs LinkedList vs..."

答案 8 :(得分:0)

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