正如我所看到的,列表相对于数组的优势非常明显:
List<Integer>, List<? extends Number>, List<? super Integer>
。addAll
,remove
等。对于数组,除了get / set之外的所有标准操作必须通过将其传递给静态方法以过程方式执行。 ArrayList
,LinkedList
,不可修改和同步列表,可以隐藏在公共列表界面下。作为缺点,我只能提到没有语法糖和运行时类型检查。同时支持这两种结构需要经常使用asList
和toArray
方法,这使得代码的可读性降低。所以我很好奇使用我想念的数组有什么重要的好处。
答案 0 :(得分:20)
在处理时间和内存占用方面,阵列都更有效。如果您使用原始类型(例如int
或long
),这尤其适用,因为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)
在以下情况下阵列更好:
阵列是:
类似于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的。