【问题标题】:java - what is the difference between a list and an arraylist [duplicate]java - 列表和arraylist有什么区别[重复]
【发布时间】:2012-08-28 16:05:42
【问题描述】:

可能重复:
What is a List vs. an ArrayList?

这两个我都用过,但我只是想知道它们之间的优缺点是什么?主要区别是什么?哪个更好用?

谢谢。

【问题讨论】:

    标签: java arrays


    【解决方案1】:

    List 是一个由ArrayList class 实现的接口List 的另一个著名实现是 LinkedList

    ArrayList 提供恒定时间随机访问,而LinkedList 提供恒定时间用于非顺序访问。当您声明一个包含ArrayList 的变量时,请考虑通过接口访问它,如下所示:

    List<ElementType> myList = new ArrayList<ElementType>();
    

    这将使您可以在不影响其余代码的情况下交换不同的实现。

    【讨论】:

      【解决方案2】:

      List 仅描述了作为列表意味着什么的合同。因此,它不是一个具体的实现,而只是一个接口。列表可以通过多种方式实现。

      特别是,您有ArrayList,它在内部保留了一个动态数组,用于按顺序存储所有元素。您还有LinkedList,它将元素存储为双向链表,即保持对前一个和下一个节点的引用的节点序列。

      Vector 是另一个List,很像ArrayList,因为它的实现基于动态数组;然而,它是旧版本 Java 的遗物,并且通过完全同步来保证线程安全。在实践中,new Vector&lt;T&gt;() 或多或少等同于 Collections.synchronizedList(new ArrayList&lt;T&gt;())

      拥有List 的原因是列表可以通过多种方式实现。话虽如此,您通常希望拥有某种适用于所有Lists 的通用行为...参见polymorphism

      【讨论】:

        【解决方案3】:

        ListinterfaceArrayList 是该接口的实现。 ArrayList 是 List,LinkedLists、Stacks、Vector 等也是。

        【讨论】:

          【解决方案4】:

          其他发帖人已经回答了您问题的“什么”部分。在它们之间进行选择时需要考虑一些注意事项。

          ArrayList 在后台使用数组。所以按索引访问可以在恒定时间内完成。如果已为数组分配了足够的空间,则添加也可以在恒定时间内完成。但是,当空间用完时,ArrayList 会分配一个更大的数组,并将旧的数组值复制到新的数组中。

          LinkedList 使用链接在一起的节点。通过索引访问可能需要遍历整个列表(线性时间)。插入只需要创建一个新节点并将其添加到末尾(如果保留了尾指针,这可能是常数时间)。

          所以“哪个更好”取决于您如何使用它。老实说,我从未测量过两者之间的性能差异,但这只是需要考虑的问题。

          【讨论】:

            猜你喜欢
            • 2013-01-31
            • 2014-06-29
            • 1970-01-01
            • 1970-01-01
            • 2015-11-08
            • 2018-10-03
            • 2011-02-28
            • 2015-12-07
            相关资源
            最近更新 更多