我应该使用ArrayList<?>还是List<?>?

5

我正在开发Android应用,想知道ArrayList和List之间的主要区别是什么?


2
你看过它们各自的文档吗?那应该能立即回答这个问题。 - Konrad Rudolph
@KonradRudolph 我不认为这是必要的,对于那些不了解接口等内容的人来说,文档看起来就像任何其他类一样。 - Jon Taylor
@Jon 如果你不了解接口,那么整个讨论都没有意义。 - Konrad Rudolph
3
@KonradRudolph,我认为人们不应该假设别人也认为某些事情显而易见,只因为这些事情对他们来说很明显。 - Jon Taylor
@Jon 我并不是假设这很明显,我是假设你不知道这个就不能编写Java程序。顺便说一句,这并不是一个糟糕的问题,只是Stack Overflow不适合教授编程基础知识 - 书籍或教程可以更好地完成这项任务。 - Konrad Rudolph
4
我会这样修改:我认为如果你不了解接口的话,就不能很好地编写Java程序。但是,你仍然可以通过始终使用像ArrayList这样的接口实现来进行编程,甚至可能没有意识到接口的存在。 - Jon Taylor
5个回答

8

为了处理Java中的对象集合,提供了Collection接口。这在java.util包中可用。

“List”是一个接口,它扩展了Collection接口,提供了一些额外的方法来处理集合。而“ArrayList”是“List”接口的实际实现。

ArrayList类仅有极少数方法,除了List接口中可用的方法以外。这方面没有太大的区别。唯一的区别是,在第一个中,您正在创建父接口的引用,而在第二个中,您正在创建实现List(即ArrayList类)的类的引用。如果使用第一个,则可以调用List接口中可用的方法,但无法调用ArrayList类中新添加的方法。而如果使用第二个,则可以自由地使用ArrayList中所有可用的方法。

编辑:

在Java应用程序开发中,如果您将集合框架对象作为参数传递给方法,则最好选择

List tempList = new ArrayList();
somemethodcall(tempList);

因为未来由于性能限制,如果您要更改实现以使用LinkedList或实现List接口的某些其他类,而不是ArrayList,则只需更改一个点(即仅实例化部分)。否则,您将需要在所有区域进行更改,无论您在哪里使用特定类实现作为方法参数。


1
那么ArrayList新增了哪些方法呢?.forEach和.clone(浅拷贝)是主要的几个方法。 - JohnP2

8

用户370305给出了一个精确的解释。这也有助于你理解Java中的集合层次结构。

集合层次结构


3

List是一个接口,ArrayList实现了这个接口。如果你想创建一个方法需要一种List,但你并不关心真正使用的是哪种实现方式,那么就可以使用List

如果实例化一个类,则必须选择List的一种实现方式,其中之一就是ArrayList

List<String> l1 = new ArrayList<String>();

这是一个例子。

接口无法被实例化,因此如果你尝试执行以下操作,将会出现错误:

List<String> l2 = new List<String>();

1

关于这个问题,wikipedia上有一篇很好的文章,其中arraylist被称为“动态数组”。
如果您正在尝试优化您的应用程序,您应该看一下文章旁边的表格。


0

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