什么是 List 与 ArrayList? [复制]

Posted

技术标签:

【中文标题】什么是 List 与 ArrayList? [复制]【英文标题】:What is a List vs. an ArrayList? [duplicate] 【发布时间】:2011-10-15 14:22:56 【问题描述】:

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

【问题讨论】:

天哪,这个以前从来没有被问过!对于OP,请考虑先搜索论坛再询问。 @Hovercraft,你确定它之前从未被问过吗? 投票重新打开 - 我不认为链接的帖子是重复的。这是关于接口与实现的编码,而这实际上是在问ListArrayList 之间的区别是什么。 问题不涉及 List w.r.t。爪哇。一个通用的答案是——“列表是一个有序的集合”。 【参考方案1】:

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

请参阅 ArrayList 和 List。

例如,您不能使用此设置:

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

但是,这是可行的:

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

另外...您可以按照 duffymo 下面的说明进行操作,这与实现 List 接口(制作您自己的列表实现)大致相同。

【讨论】:

不,但你可以这样做: List list = new List() // 在此处实现所有 List 方法。; 有趣的事实:@duffymo 创造的神奇生物实际上被称为anonymous inner class。 ;)【参考方案2】:

考虑如下一行:

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

如果您是面向对象架构的新手,您可能希望看到类似ArrayList&lt;String&gt; names = new ArrayList&lt;String&gt;(); 的内容。毕竟你刚才说是新的ArrayList,所以不应该把它存入ArrayList类型的变量吗?

嗯,你当然可以做到。然而,List 是一个接口——类似于某种模板——据说ArrayList 是继承的。这是一份合同,上面写着“任何时候你使用List 实现,你都可以期望这些方法可用”。对于List,方法是addget等。

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

问题是,虽然您确实需要在创建对象时指定您想要的对象,但您通常只需要传达它是List 的事实,所以您只需说它就是这样。 List 表示您有一个集合,该集合旨在按照给定的顺序排列。如果您不需要进行太多通信,您可以考虑将其作为Collection 传递,这是另一个接口(@98​​7654339@ 的超级接口)。或者,如果您需要交流的只是可以对其进行迭代,您甚至可以将其称为Iterable

【讨论】:

【参考方案3】:

List是一个接口; ArrayList 是一个实现 List 接口的类。

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

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

【参考方案5】:

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

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

您可以使用多种具体的和现成的 List,例如 ArrayList、VectorLinkedListStack。使用 which 的决定来自您,如果您查看 List API,您会注意到所有这些 List 实现都以一种或另一种方式从 List 扩展。

【讨论】:

【参考方案6】:

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

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

引用ArrayList页面上的java文档,

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

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

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

【讨论】:

他不是。他在问什么时候应该使用 List,什么时候应该使用 ArrayList。 LinkedList 没有进入它 - 正如所有先前的答案可能已经表明的那样。 LinkedList 是对这个特定问题的误导。

以上是关于什么是 List 与 ArrayList? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

List 和 ArrayList 有啥区别? [复制]

原因 - List list = new ArrayList(); [复制]

多态性:为啥使用“List list = new ArrayList”而不是“ArrayList list = new ArrayList”? [复制]

为啥循环遍历 ArrayList<String> 与常规数组相同? [复制]

Vector与ArrayList区别

为啥这一行不编译 List<Object> l = new ArrayList<String>()? [复制]