2011-07-29 126 views
19

這兩個對象之間的根本區別是什麼?更高效嗎?一個人有更多的方法嗎?什麼是List與ArrayList?

+6

天哪,*這*以前從未問過!對於OP,請先考慮搜索論壇。 –

+0

@Hovercraft,你確定它從未被問過嗎? – Atreys

+5

投票重新打開 - 我不認爲鏈接的帖子是重複的。這是關於編碼接口還是實現,而這實際上是問'List'和'ArrayList'之間的區別是什麼。 –

回答

23

列表在接口中,而ArrayList是一個類。

參見ArrayListList

E.g,您不能使用此設置:

List<String> list = new List<String>(); ...因爲它是一個接口。

然而,這個工程:

ArrayList<String> arrayList = new ArrayList<String>();

而且......你可以爲duffymo做如下表示,這或多或少是一樣實現List接口(製作自己的列表實現)。

+3

不,但您可以這樣做:列表 list = new列表(){//在此實現所有List方法。}; – duffymo

2

A List定義了ArrayList使用的接口,該接口允許它實現允許實現List的所有其他類一起使用或以類似方式使用的方法。 ArrayList總是也是List,但List不一定是ArrayList

也就是說,ArrayList執行List(在其他幾個接口之間)。

13

列表是一個接口; ArrayList是一個實現List接口的類。

接口定義了所需的方法簽名,但沒有說明它們是如何實現的。

實現接口的類承諾提供具有由接口聲明的相同簽名的方法的公共實現。

-1

根據java docs,List只是一個接口,而ArrayList是實現它的類之一。特別是使用ArralyList而不是對ArrayList對象的List類型引用沒有內在的效率優勢。

但是,當涉及到「效率」時,List接口的不同實現之間可能存在差異。例如,LinkedList和ArrayList之間可能存在小的效率差異,具體取決於您如何使用它們。

引述Java文檔的ArrayList頁上,

增加操作運行在分期常量時間,即,添加N元素需要O(n)的時間。所有其他操作都在線性時間內運行(粗略地說)。與LinkedList實現相比,常數因子較低。

換句話說,性能差異可能可以忽略不計,但您可能會看到使用ArrayList(而不是LinkedList)的一些優勢。

如果你有興趣,ArrayList是用一個不時調整大小的數組實現的(很可能每當你的集合的大小增加一倍時),這與LinkedList的實現完全不同(詳見wikipedia )。

+1

他不是。他問他什麼時候應該使用List以及何時應該使用ArrayList。 LinkedList並沒有進入它 - 正如所有以前的答案可能已經表明的那樣。 LinkedList是這個特定問題的誤導。 – RichieHH

16

考慮類似下面的一行:

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

如果你是新的面向對象的架構,你可能期望而不是看到類似ArrayList<String> names = new ArrayList<String>();。畢竟,你剛剛說過這是一個新的ArrayList,所以你不應該將它存儲在類型爲ArrayList的變量中?

那麼,你當然可以做到這一點。然而,List是一個接口 - 就像各種各樣的模板 - 據說ArrayList被繼承。這是一個合同,它說「任何時候你使用List實現,你可以期待這些方法可用」。在List的情況下,方法之類的東西addget

ArrayList只是List一個實現。還有其他的,如LinkedList。兩者具有相同的界面,並且可以以相同的方式使用,但在幕後工作方式非常不同。其中ArrayList是「隨機」訪問,意味着它直接找到數組中的一個特定元素而沒有遍歷整個列表,所以LinkedList確實必須從第一個元素開始,然後一個接一個地去找,直到它到達需要的元素。

事情是,雖然您確實需要在創建對象時指定您想要的內容,但通常只需要溝通的事實不只是它是List,因此您只需說出它就是這樣。 List表示您有一個旨在按給定順序的集合。如果你不需要太多的溝通,你可以考慮將它作爲Collection傳遞給另一個接口(List的超級接口)。或者,如果你需要溝通的是你可以迭代它,你甚至可以稱它爲Iterable

1

如何使用List和ArrayList或List的其他實現是PolymorphismInheritance,也是使用Java等語言的原因。

簡單來說,多態是很多形式,而繼承是重用。

可以有多種混凝土,並準備好我們可供您使用的列表,如ArrayList,VectorLinkedListStack。決定使用哪個來自你,如果你看看List API,你會注意到所有這些List實現都以某種方式從List中延伸出來。

相關問題