2010-11-06 105 views
1

說我想在java中使用鏈表。我認爲最好的創建方法是:Java數據結構(簡單問題)

List list = new LinkedList();

但我注意到這樣我只能使用通用列表上的方法。我假設實現在不同的數據結構中是不同的。

所以,如果我想使用鏈表的具體方法,我必須要創建列表:

LinkedList的名單=新的LinkedList();

這樣做的主要原因是什麼?

Tnanks。

+0

爲了上帝的愛。請通過縮進四個空格將代碼標記爲代碼。 http://daringfireball.net/projects/markdown/syntax#precode – 2010-11-06 20:06:03

回答

4

List是一個抽象底層列表實現的接口。它也由例如ArrayList

但是,如果您特別想要一個LinkedList,寫入LinkedList list沒有任何問題。事實上,如果你只是通過它周圍的名單,人們可以(不知道實現)不知不覺寫這樣的算法:

for(int i = 0; i < list.size(); i++) 
{ 
    // list.get(i) or list.set(i, obj) 
} 

這是一個隨機訪問列表上的直線(如ArrayList),但二次上一個LinkedList (最好使用迭代器或列表迭代器)。 Java提供了RandomAccess標記接口,以便您可以區分。

當然,您也可以將這些方法稱爲LinkedList,但人們應該更可能考慮成本。

請注意,因爲這個原因,在.NET LinkedList中沒有實現IList

1

第一個習慣用法允許您更改列表指向的運行時類型,而無需修改任何使用它的客戶端代碼。

LinkedList中的哪些方法,你認爲你需要的不在List中?你總是可以爲這些人投。

但接口背後的整個想法是爲了防止客戶端接口的實現。

如果你真的需要一個LinkedList,那就這樣吧。但我更喜歡第一個成語,因爲大多數時候我真的只需要List方法。

1

每個LinkedList也是一個List。這也意味着您可以使用LinkedList完成所有任務,您可以使用List完成任務,並且可以將LinkedList存儲爲List。但是,當您將它作爲List存儲時,只能調用List也具有的LinkedList方法。

順便說一句:這不是泛型。泛型是這樣的:

LinkedList<String> list = new LinkedList<String>(); 
1
List list = getSomeList(); 

在這裏,我們說這是一個列表。你不知道它是否是LinkedListArrayList或其他什麼。這是一個抽象的東西(我認爲你的意思是「抽象」的單詞「通用」,因爲generics是完全不同的東西)。因此,你不能把它看作是一個LinkedList - 你必須把它看作是一個List(它是)。

「你知道」這是一個LinkedList的事實都很好,你可以安全地施放,如果你需要這樣做。但它可能有助於告訴編譯器它是一個LinkedList,通過聲明它,如果它總是作爲LinkedList