关于Java:LinkedList vs ArrayList实现的区别?

Difference in LinkedList and ArrayList implementation?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
When to use LinkedList<> over ArrayList<>?

我看到了arraylist和linkedlist的API,它看起来是相同的。除了性能差异之外,在添加、删除和迭代列表方面还有任何差异。

1
2
3
List arrList = new ArrayList();

List linList = new LinkedList();

列表arrList or linList引用实际上实现了相应的类。这实际上意味着什么?


就你的第一个问题而言:他们的性能和内存使用对你来说唯一重要的区别(第三个问题,他们的实际实现细节,不是你关心的)LinkedList使用更多的内存,比如说,通过从头部浏览列表获得第22个元素是非常慢的;但就目前而言,他们是非常棒的。在列表中间添加和删除元素。ArrayList使用较少的内存,获取第22个元素非常快,但是在中间插入或删除元素需要的时间与列表的大小成比例。

至于你的第二个问题:引用是"实际实现列表"的说法是错误的,所以我不知道如何回答它。引用变量引用实现List接口的对象;这两个类都实现了该接口,因此类型List的引用可以引用任一类的对象。


当你问"这到底是什么意思"时,我不完全确定你的意思。但是这里有一个猜测。

考虑这样的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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都可以访问列表接口中的任何方法,但是它们除了列表接口之外提供的任何方法都不能在没有强制转换的情况下调用。您可以(并且在大多数情况下应该)将ArrayList和LinkedList视为列表。

对于从不同列表中插入/添加/删除的细节,通常不应该在意。从最终结果的角度来看,两者的行为都是相同的(例如,具有相同数据的相同方法调用序列将导致相同的结果,只是内部布局不同)。


在Java教程中,对这两个列表实现的优缺点有一个很好的讨论。请参见有关列表实现的主题。


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