什么是 List 与 ArrayList? [复制]
Posted
技术标签:
【中文标题】什么是 List 与 ArrayList? [复制]【英文标题】:What is a List vs. an ArrayList? [duplicate] 【发布时间】:2011-10-15 14:22:56 【问题描述】:这两个对象的根本区别是什么?一个更有效率吗?有更多的方法吗?
【问题讨论】:
天哪,这个以前从来没有被问过!对于OP,请考虑先搜索论坛再询问。 @Hovercraft,你确定它之前从未被问过吗? 投票重新打开 - 我不认为链接的帖子是重复的。这是关于接口与实现的编码,而这实际上是在问List
和ArrayList
之间的区别是什么。
问题不涉及 List w.r.t。爪哇。一个通用的答案是——“列表是一个有序的集合”。
【参考方案1】:
List 在接口中,而 ArrayList 是一个类。
请参阅 ArrayList 和 List。
例如,您不能使用此设置:
List<String> list = new List<String>();
... 因为它是一个接口。
但是,这是可行的:
ArrayList<String> arrayList = new ArrayList<String>();
另外...您可以按照 duffymo 下面的说明进行操作,这与实现 List
接口(制作您自己的列表实现)大致相同。
【讨论】:
不,但你可以这样做: Listanonymous inner class
。 ;)【参考方案2】:
考虑如下一行:
List<String> names = new ArrayList<String>();
如果您是面向对象架构的新手,您可能希望看到类似ArrayList<String> names = new ArrayList<String>();
的内容。毕竟你刚才说是新的ArrayList
,所以不应该把它存入ArrayList
类型的变量吗?
嗯,你当然可以做到。然而,List
是一个接口——类似于某种模板——据说ArrayList
是继承的。这是一份合同,上面写着“任何时候你使用List
实现,你都可以期望这些方法可用”。对于List
,方法是add
、get
等。
但ArrayList
只是List
的一种实现。还有其他的,例如LinkedList
。两者具有相同的界面,并且可以以相同的方式使用,但在幕后工作却大不相同。其中ArrayList
是“随机”访问,这意味着它直接找到数组的特定元素而不遍历整个列表,LinkedList
确实必须从第一个元素开始并一个接一个地到达你需要的元素。
问题是,虽然您确实需要在创建对象时指定您想要的对象,但您通常只需要传达它是List
的事实,所以您只需说它就是这样。 List
表示您有一个集合,该集合旨在按照给定的顺序排列。如果您不需要进行太多通信,您可以考虑将其作为Collection
传递,这是另一个接口(@987654339@ 的超级接口)。或者,如果您需要交流的只是可以对其进行迭代,您甚至可以将其称为Iterable
。
【讨论】:
【参考方案3】:List是一个接口; ArrayList 是一个实现 List 接口的类。
接口定义了所需的方法签名,但没有说明它们是如何实现的。
实现接口的类承诺提供具有接口声明的相同签名的方法的公共实现。
【讨论】:
【参考方案4】:List
定义了ArrayList
使用的接口,该接口允许它实现允许所有其他实现 List 的类一起使用或以类似方式使用的方法。 ArrayList
始终也是 List
,但 List
不一定是 ArrayList
。
也就是说,ArrayList
实现了List
(在其他几个接口中)。
【讨论】:
【参考方案5】:如何使用List和ArrayList
,或者List的其他实现,是Polymorphism
和Inheritance
,也是使用Java等语言的原因。
简单来说,多态是多种形式,而继承是重用。
您可以使用多种具体的和现成的 List,例如 ArrayList、Vector
、LinkedList
和 Stack
。使用 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 list = new ArrayList(); [复制]
多态性:为啥使用“List list = new ArrayList”而不是“ArrayList list = new ArrayList”? [复制]