2016-02-08 84 views
3

當我宣佈LinkedList這樣的:Java集合(LinkedList的概念)

List<String> names = new LinkedList<String>(); 

它不支持任何LinkedList的特殊方法(例如:names.peekLast()names.pollFirst()

但是,當我宣佈樣:

LinkedList<String> names = new LinkedList<String>(); 

那麼它支持這些方法。

是的,很顯然,原因是參考,因爲LinkedList包含那方法和List沒有!

但我的問題是,當我想與LinkedList一起工作,哪一個更好更正確?或者他們的用法是什麼?

回答

2

如果你需要使用LinkedList方法中不存在List,你應該使用LinkedList引用(你可以以調用LinkedList具體方法使用List參考和轉換爲LinkedList,但是這將使意義不大)。

否則,最好使用List接口來保存引用,因爲它使您的代碼更通用,因爲它不依賴於任何特定的List實現。

0

那麼,列表基本上是由一個數組,通常比當前數量的項目大。這些元素放在一個數組中,當舊元素空間不足時創建一個新數組。這對索引訪問非常快,但在刪除或插入列表中的元素或開始時很慢。在列表末尾添加/刪除條目相當便宜。

LinkedList是一個雙向鏈表 - 每個節點都知道它的上一個條目和下一個鏈接。這在插入特定節點(或頭部/尾部)之後/之前很快,但是在按索引訪問時很慢。

LinkedList通常需要比List更多的內存,因爲它需要所有那些下一個/上一個引用的空間 - 並且數據可能具有較少的引用位置,因爲每個節點都是獨立的對象。另一方面,List可以有一個比當前需求大得多的支持數組。從Difference between List<T> and LinkedList<T>

您也可以參考

參考到Oracle文檔

Linked List 

所有操作的執行是可以預期的雙向鏈表。索引到列表中的操作將從開始或結束遍歷列表,以哪個更接近指定的索引爲準。

List 

List接口提供了四種位置(索引)訪問列表元素的方法。列表(如Java數組)基於零。請注意,對於某些實現(例如,LinkedList類),這些操作的執行時間可能與索引值成比例。因此,如果調用者不知道實現,遍歷列表中的元素通常更適合通過索引進行索引。

+1

Minor nitpick:列表通常由數組支持,但由於List是一個接口,這不是保證。你可以創建一個使用樹來存儲數據而不是數組的實現類。哎呀,如果你真的想折磨自己,你可以使支持數據結構爲字符串,然後使用一些可怕的反射代碼+正則表達式來存儲對象。如果您正在編程界面,實施應該沒有關係。 –

-1

那麼有一個非常簡單的解釋,就是List<>就像數組在空間不足時正在創建新數組。而LinkedList<>就像雙鏈表,每個節點都有前一個節點的鏈接和下一個節點。

更多的,你可以從Oracle文檔 https://docs.oracle.com/javase/7/docs/api/java/util/List.html

https://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html

你可以通過你的自我區分搜索。 :)

+1

'List <>'不是由數組支持的 - 它可以是(如在ArrayList中)。但由於LinkedList也是一個List(顯然**不受數組支持),所以語句「List <>'就像是一個正在創建新數組的數組......」顯然是錯誤的。 –

+0

List <>基本上由數組支持,這就是爲什麼我這樣說。所以你可能會不會是正確的。但是隻列出其基本烘焙的數組。 – Krishna

+0

不,List <>僅僅是一個接口,沒有實現。它如何由數組支持?讓我看看實施! –