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

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

【问题讨论】:

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

标签: java list arraylist


【解决方案1】:

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

请参阅 ArrayListList

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

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 是对这个特定问题的误导。
          猜你喜欢
          • 2012-04-08
          • 2015-05-29
          • 2014-07-22
          • 2017-05-08
          • 2013-01-31
          • 2015-11-08
          • 2011-10-21
          • 2014-01-09
          • 2018-02-23
          相关资源
          最近更新 更多