LinkedList和ArrayList实现的区别?

时间:2011-09-05 02:24:01

标签: java

  

可能重复:
  When to use LinkedList<> over ArrayList<>?

我看到了ArrayList和LinkedList的API,它看起来是一样的。除了它们的性能差异之外,在添加,删除和迭代List方面存在任何差异。

List arrList = new ArrayList();

List linList = new LinkedList();

List arrList or linList引用实际上是在实现相应的类。这究竟意味着什么?

4 个答案:

答案 0 :(得分:3)

就你的第一个问题而言:他们的表现和内存使用情况时,唯一与你无关的差异(第三个,他们的实际实施细节,不是你的担忧。)LinkedList使用更多记忆,从头部走过列表得到第22个元素是非常缓慢的;但就添加和删除列表中间的元素而言,它们非常棒。 ArrayList使用更少的内存,获得第22个元素的速度非常快 - 但在中间插入或删除元素需要的时间与列表的大小成正比。

就你的第二个问题而言:引用“实际实现列表”的陈述是错误的,所以我真的不知道如何回答它。引用变量是指实现List接口的对象;这两个类都实现了该接口,因此类型List的引用可以引用任一类的对象。

答案 1 :(得分:2)

当你问“这究竟是什么意思?”时,我不是100%肯定你的意思,但这是一个猜测。

考虑这样的代码:

interface Interface
{
   void foo();
}

class Implementation
    implements Interface
{
    public void foo() { }
    public void bar() { }
}

public class Main
{
    public static void main(final String[] argv)
    {
        Interface a;
        Implementation b;

        a = new Implementation();
        b = a;

        a.foo();
        b.foo();
        a.bar(); <-  won't compile
        b.bar();
    }
}

接口a;和实施b;两者都指向同一个对象,但只有对“b”的引用才能访问“bar”方法。

因此,在您的示例中,arrList和linList都可以访问List接口中的任何方法,但除了List接口之外,它们提供的任何方法都不能在没有强制转换的情况下调用。您可以(并且在大多数情况下)将ArrayList和LinkedList视为List。

对于从不同列表中插入/添加/删除的细节,您通常不应该关心。从最终结果的角度来看,两者的行为方式相同(例如,使用相同数据的相同方法调用序列将产生相同的结果,只是内部布局会有所不同)。

答案 2 :(得分:1)

在Java教程中对这两个List实现的优缺点进行了很好的讨论。请参阅List Implementations上的主题。

答案 3 :(得分:0)

ArrayList由数组支持,该数组在需要时调整大小。 LinkedList由元素节点组成,其引用指向上一个节点和下一个节点。这个网站上有很多帖子讨论差异,只是搜索它们。