为什么在Java中使用列表(Lists)比数组(Arrays)更受欢迎?

14

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

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

它背后的原因是什么?

7个回答

18

通常情况下,你应该选择适合当前任务的正确数据结构。你需要了解手头的任务以及所有不同选项以及它们在迭代、搜索、添加、删除和插入数据方面的比较。总体而言,你需要了解数据结构如何访问和操作内存,并根据预计应用程序的使用方式选择最佳的数据结构。

显然,并不总是一目了然的。但是你可以了解不同数据结构的理想情况。

例如,在纯静态、固定长度的数据中,如果你只需要迭代而无需进行搜索,则使用数组是理想的。在密码算法中通常使用这种类型的数组。如果数据是静态的,但你需要进行搜索,你可能需要某种类型的树形结构。如果你需要快速插入,则哈希可能是理想的选择。如果数据经常发生变化,则需要一种能够高效更改其大小的结构,如列表。

当然,还有很多不同的数据结构设计来解决各种特定问题的变化和组合。之所以有这么多的数据结构,是因为它们在编写高效程序中扮演着重要角色。我的意思是,学习数据结构。了解每种数据结构的理想情况,然后你就能够为任何任务决定或设计合适的数据结构。


1
感谢您的出色回答。 - Kasun Siyambalapitiya

6

来自 Array 和 ArrayList 的比较

当您事先不知道元素数量时,使用 ArrayList 要比 Array 更好。ArrayList 比 Arrays 慢。所以,如果需要效率,请尽可能使用数组。


3

列表可以很容易地增加大小,并且您可以轻松地在列表中添加和删除元素。这是数组所不能做的。不过,您需要考虑一下您需要列表的目的。如果您认为列表不会经常更改,则应该使用数组。


1
自动调整大小并不是唯一的原因。List 参与了所有 Collections API 的好处,因此您只需使用 API 就可以解决大多数与数据结构相关的问题。 - cherouvim

1
需要记住的一件事是,Java集合类更倾向于通用易用性,而不是针对特定场景进行优化。因此,正如之前的回答者所说,您确实需要考虑如何使用它。
例如,如果您正在创建“大型”数据结构,则ArrayList可能会变得非常低效。每次达到数组限制时,它都会在(我相信)2倍大小处分配一个新的数组。因此,平均而言,ArrayList仅会利用75%。
总的来说,可以认为Java集合是第一次近似,通常大多数情况下都足够好,当您有可测量的性能问题时,应准备使用替代的、更专业的集合实现。
在您提到的情况下,您可以将ArrayList视为处理数组的更方便的方法。

0

编辑:
在处理原始类型时,有些情况下最好使用数组,因为在使用ArrayLists的情况下,涉及到原始类型的装箱和拆箱,与使用数组处理原始类型相比可能会慢一些。


请不要将myList声明为具体类型(ArrayList)。最好使用接口List。 - cherouvim
如果字段不是公共API,使用List或ArrayList都无所谓。例如,在Android上,调用ArrayList具体类型的方法比调用List接口更容易。我倾向于将我的私有字段声明为具体类型,并在公共API(getter等)中返回接口。 - NateS

0

我使用列表、动态数组等,主要是因为我不需要担心下一个空闲位置在哪里或者是否足够大,因为Sun已经替我做了这些。


0
是的,将其声明为List比ArrayList更好。为什么?原因是代码解耦。
这样做的主要原因是将您的代码与接口的特定实现分离。
余下的代码只知道数据是列表类型,因此您可以在不同的列表接口实现之间切换。
假设您将其声明为ArrayList,然后您意识到应该使用LinkedList,更改不容易,因为不能保证其余的代码不使用特定于ArrayList的方法。
但是,如果您将其声明为List,则可以简单地更改List的实例。
List <Integer> list = new ArrayList<Integer>();

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

肯定会起作用,因为你编写的代码遵循了列表接口提供的合同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接