为什么在Java中使用Lists而不是Arrays是首选?

时间:2010-03-06 06:13:59

标签: java arrays list arraylist data-structures

许多人和作者建议我们使用list而不是数组。

List <Integer> list = new ArrayList<Integer>();
list.addElement(1);
....

它背后的原因是什么?

7 个答案:

答案 0 :(得分:14)

您通常更愿意为作业选择正确的数据结构。您需要了解手头的任务以及您拥有的所有不同选项以及它们在迭代,搜索,添加,删除和插入数据方面的比较。通常,您需要了解数据结构如何访问和操作内存,并根据您预期应用程序的使用方式选择最佳数据结构。

显然,它并不总是很明确。但是你可以理解不同数据结构的理想。

例如,纯静态,固定长度的数据,您只需迭代,无需搜索,是阵列的理想选择。在密码算法中使用这样的数组是很常见的。如果数据是静态的,而不是迭代,则需要搜索,您可能需要某种类型的树结构。如果你想快速插入,散列可能是理想的。如果数据经常发生变化,您需要一个能够有效改变其大小的结构,如列表。

当然,有许多数据结构的变体和组合旨在解决各种特定问题。之所以如此之多,是因为他们在编写高效课程时的重要性。无论如何,我的观点是,了解数据结构。了解每种情况的理想情况,然后您就可以为任何任务决定或设计合适的数据结构。

答案 1 :(得分:4)

来自Array vs ArrayList

  

ArrayList比Array更好   当你不知道的时候使用   推进元素数量。   ArrayList比Arrays慢。所以,   如果你需要效率尝试使用   尽可能使用数组。

答案 2 :(得分:3)

列表的大小很容易增加,您可以轻松地在列表中间添加和删除元素。使用数组无法做到这一点。你需要考虑你需要的列表。如果您认为列表不会发生很大变化,那么请改用数组。

答案 3 :(得分:1)

要记住的一件事是Java Collections类支持通用易用性优于特定场景的优化。因此,正如之前的响应者所说,你真的需要考虑如何使用它。

例如,如果您正在创建“大型”数据结构,那么ArrayList可能会变得非常低效。每次达到数组的极限时,它会在(我相信)大小的2倍时分配一个新的。因此,平均而言,ArrayList的利用率仅为75%。

一般来说,人们可以认为Java Collections是大多数时候通常都足够好的第一个近似值,当你有可测量的性能问题时,你应该准备好使用备用的,更专业的集合实现。

在你提到的情况下,你可以认为ArrayList只是处理数组的一种更方便的方法。

答案 4 :(得分:0)

编辑:
在处理原始类型的某些情况下,最好使用数组,因为在Arraylists的情况下,它涉及原语的装箱和拆箱,与处理带数组的原语相比,这可能会慢一些。

答案 5 :(得分:0)

我使用Lists,ArrayLists等主要是因为我不需要担心下一个空闲插槽的位置,或者它是否足够大,因为Sun已经为我做了这个。

答案 6 :(得分:0)

是的,将其声明为List优于ArrayList。为什么? 答案是代码解耦

这样做的主要原因是将您的代码与接口的特定实现分离。

其余代码仅知道数据是List类型,因此您可以在list接口的不同实现之间进行切换。

假设您将其声明为ArrayList,然后意识到应该使用LinkedList,更改它并不容易,因为无法保证其余代码不会使用特定于ArrayList的方法。

但是,如果您将其声明为列表,则只需更改列表的实例,

List <Integer> list = new ArrayList<Integer>();

List <Integer> list = new LinkedList<Integer>();

,并且确保这将起作用,因为您已编写了遵循列表界面提供的合同的代码。