2011-09-05 128 views
3

可能重複:
When to use LinkedList<> over ArrayList<>?LinkedList和ArrayList實現的區別?

我看到了ArrayList和LinkedList的API,它似乎是相同的。除了它們的性能差異之外,在添加,刪除和迭代列表方面還有什麼不同。

List arrList = new ArrayList(); 

List linList = new LinkedList(); 

列表arrList or linList引用實際上是實現相應的類。這實際上意味着什麼?

+4

看看這個非常相似的問題。http://stackoverflow.com/questions/322715/when-to-use-linkedlist-over-arraylist – Psyrus

回答

1

當你問「這究竟是什麼意思?」時,我並不是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(); 
    } 
} 

接口一個;和實施b;都指向相同的對象,但只有對「b」的引用才能訪問「bar」方法。

因此,在你的例子中,List接口中的任何方法都可以被arrList和linList訪問,但是除了List接口之外,它們提供的任何方法都不會被調用,而不需要強制轉換。你可以(也應該在大多數情況下)把ArrayList和LinkedList當作List來處理。

對於從不同列表中插入/添加/刪除的細節,您通常不應該在意。從最終結果的角度來看,兩者的行爲方式都是相同的(例如,使用相同數據的同一系列方法調用會得到相同結果,只是內部佈局會不同)。

+0

你能詳細解釋我如何界面a和B班指向同一個對象...我不明白整行 – theJava

+0

a = new Implementation(); b = a;第一個a被設置爲Implementation的新實例,然後b指向同一個實例。這種幫助? – TofuBeer

+0

但只有對「b」的引用才能訪問「bar」方法。爲什麼這樣???? – theJava

3

就您的第一個問題而言:他們的表現和內存使用情況對您而言唯一的區別(第三個,他們的實際實現細節不是您的擔心)。LinkedList s使用更多內存,並且比如說,從頭部通過名單來獲得第二十二個元素是非常緩慢的;但就添加和刪除列表中的元素而言,它們非常棒。 ArrayList使用更少的內存,獲得第22個元素的速度非常快 - 但在中間插入或移除元素需要的時間與列表大小成比例。

就你的第二個問題而言:引用是「實際執行列表」的說法是錯誤的,所以我真的不知道如何回答它。參考變量是指實現List接口的對象;這兩個類都實現該接口,因此類型List的引用可以引用任一類的對象。

0

ArrayList由需要時調整大小的數組支持。 LinkedList由元素節點組成,其中引用指向前一節點和下一節點。本網站上有許多帖子都在討論差異,只是搜索它們。

1

在Java教程中對這兩個List實現的優缺點有很好的討論。請參閱List Implementations上的主題。

相關問題