什么是List与ArrayList?

时间:2011-07-29 00:51:24

标签: java list arraylist

这两个对象有什么根本区别?一个更有效率?有没有更多方法?

6 个答案:

答案 0 :(得分:24)

List在接口中,而ArrayList是一个类。

请参阅ArrayListList

例如,您无法使用此设置:

List<String> list = new List<String>(); ...因为它是一个界面。

然而,这有效:

ArrayList<String> arrayList = new ArrayList<String>();

另外......你可以像下面的duffymo那样做,这与实现List接口(制作你自己的列表实现)大致相同。

答案 1 :(得分:19)

考虑以下几行:

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

如果您是面向对象体系结构的新手,您可能希望看到类似ArrayList<String> names = new ArrayList<String>();的内容。毕竟,你刚才说它是一个新的ArrayList,所以你不应该把它存储在ArrayList类型的变量中吗?

嗯,你当然可以做到。但是,List是一个接口 - 就像一个类型的模板 - 据说ArrayList继承。这是一份合同,上面写着“无论何时使用List实施,您都可以期待这些方法可用”。对于List,方法类似于addget等。

ArrayList只是List的一个实现。还有其他人,例如LinkedList。两者具有相同的界面,并且可以以相同的方式使用,但在幕后工作方式非常不同。其中ArrayList是“随机”访问,意味着它直接找到数组的特定元素而不遍历整个列表,LinkedList必须从第一个元素开始并逐个进行直到它到达你需要的元素。

问题是,虽然您确实需要在创建对象时指定所需的内容,但通常只需要进行通信,而不仅仅是List这样的事实,所以您只需要说它是什么是。 List表示您有一个集合,该集合旨在按照给定的顺序。如果您不需要那么多的沟通,您可以考虑将其作为Collection传递,这是另一个接口(List的超级接口)。或者,如果你需要沟通的只是你可以迭代它,你甚至可以称之为Iterable

答案 2 :(得分:13)

列表是一个界面; ArrayList是一个实现List接口的类。

接口定义了所需的方法签名,但没有说明它们是如何实现的。

实现接口的类承诺提供具有接口声明的相同签名的方法的公共实现。

答案 3 :(得分:2)

List定义ArrayList使用的接口,允许它实现允许实现List的所有其他类一起使用或以类似方式使用的方法。 ArrayList始终为List,但List不一定是ArrayList

也就是说,ArrayList实现List(在其他几个接口中)。

答案 4 :(得分:1)

如何使用List和ArrayList或List的其他实现,PolymorphismInheritance,以及使用Java等语言的原因。

简单来说,多态性是多种形式,而继承是重用。

您可以使用多种具体和准备好的列表,例如ArrayList,VectorLinkedListStack。决定使用哪个来自你,如果你看一下List API,你会注意到所有这些List实现都以一种方式从List扩展。

答案 5 :(得分:0)

根据java docs,List只是一个接口,而ArrayList是实现它的类之一。使用ArralyList而不是对ArrayList对象的List类型引用没有固有的效率优势。

然而,当谈到“效率”时,List接口的不同实现之间可能存在差异。例如,LinkedList和ArrayList之间的效率差异很小,具体取决于您使用它们的方式。

引用ArrayList页面上的java文档,

  

添加操作以分摊的常量时间运行,即添加n个元素需要O(n)时间。所有其他操作都以线性时间运行(粗略地说)。与LinkedList实现相比,常数因子较低。

换句话说,性能差异可能可以忽略不计,但您可能会看到使用ArrayList(而不是LinkedList)的一些优势。

如果您感兴趣,ArrayList是使用不时调整大小的数组实现的(很可能每当您的集合大小翻倍时),这与LinkedList的实现完全不同(有关详细信息,请参阅维基百科)