arrays的好处
正如我所看到的,列表相对于数组的优势非常明显:
- generics提供更精确的输入:
List, List, List
List, List, List
List, List, List
。 - List接口有一堆有用的方法:
addAll
,remove
等。对于数组,除了get / set之外的所有标准操作必须通过将它传递给静态方法以过程方式执行。 - 集合提供不同的实现,如
ArrayList
,LinkedList
,unmodifieable和synchronized列表,可以隐藏在公共List接口下。 - OOB长度控制。
作为缺点,我只能提到没有语法糖和运行时类型检查。 同时支持两种结构需要频繁使用asList
和toArray
方法,这使得代码的可读性降低。 所以我很好奇使用我想念的数组有什么重要的好处。
在处理时间和内存占用方面,arrays更有效。 如果您对基本类型(如int
或long
进行操作,则这尤其适用,因为List
要求所有元素都包装在Object
(例如Integer
或Long
)中。 虽然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