List和ArrayList有什么区别?

168

我最近在办公室的Android项目中使用ArrayList,但我有些困惑List和ArrayList之间有什么区别,应该使用哪个?

此外,我看到一些关于它的实现。

List<SomeObject> myList = new ArrayList<SomeObject>();

ArrayList<SomeObject> myList = new ArrayList<SomeObject>();

这两个实例有什么区别?


3
什么是List和ArrayList的区别?List和ArrayList都是Java中常用的数据结构。其中,List是一个接口,而ArrayList是它的一个具体实现。List是一个有序集合,它可以包含重复元素。通过索引值访问列表中的元素,可以在列表的任何位置插入或删除元素。ArrayList是List接口的一个动态数组实现。它继承了AbstractList并实现了List接口。它可以存储对象,并提供对它们的快速随机访问。与普通数组不同,它可以自动调整大小以适应添加或删除元素的需求。总的来说,List提供了一种抽象的、高层次的概念,而ArrayList则是List的具体实现之一。 - user499054
3
其中一个是接口,另一个是类。现在你可以自己找出它们的区别。 - Rohit Jain
1个回答

178

在您的这两个例子中,列表实现没有区别。 但是,在代码中进一步使用变量myList的方式上有所不同。

当您将您的列表定义为:

List myList = new ArrayList();

你只能调用在List接口中定义的方法和引用成员。 如果你将其定义为:

ArrayList myList = new ArrayList();

你将能够调用ArrayList特定的方法和使用从List继承的成员,除此之外还能增加ArrayList特有的成员。

然而,在第一个例子中调用List接口的方法时,实际上是调用了ArrayList中的对应方法(因为List接口本身并没有实现任何方法)。

这就是多态。你可以阅读相关资料了解更多。


210
List不是一个类,它是一个接口。它没有实现任何方法。因此,如果你在List引用上调用一个方法,实际上会在两种情况下都调用ArrayList的方法。 - robonerd
4
正如@robonerd在上面所解释的那样,这里存在一个区别。List是一个接口(Interface),你可以使用它来定义变量,不仅限于类或基本类型,还包括接口。 - Esteban A. Maringolo
7
请仔细阅读我的帖子,不要混淆定义和实现。在两种情况下,实现是相同的:ArrayList。变量的定义不同。我不确定你试图在我的答案中改变什么。 - ATrubka
1
在这两个例子中,如果我调用一个方法,该方法将执行ArrayList类中的方法,那么定义List myList = new ArrayList();有什么用呢? - Nandan A
2
这样,您可以将代码与List接口的特定实现解耦。如果以后有人决定LinkedList更好,那么唯一改变的就是赋值。上面的示例太简单,无法展示其优点。现实生活中的例子更加复杂。例如,将会有一个以List作为参数而不是ArrayList的方法。请查看Collections.sort()和Collections类的其他方法。 - ATrubka
显示剩余2条评论

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