2013-03-19 75 views
5
Collection list = new LinkedList(); // Good? 
LinkedList list = new LinkedList(); // Bad? 

第一變體提供了更多的靈活性,但是是這樣嗎?是否有其他理由更喜歡它?性能如何?集合是否比LinkedList更好?

+1

集合是由LinkedList實現的接口。你應該總是在實現中指向一個接口。 – emd 2013-03-19 20:54:36

回答

7

這些設計決策,和一個大小通常不適合所有。同樣,內部用於成員變量的內容的選擇可以(通常應該)與暴露於外部世界的內容不同。

在它的心臟,Java的集合框架沒有提供一套完整的描述了性能特性,而不暴露的實現細節的接口。描述性能的一個接口,RandomAccess是一個標記接口,甚至不會擴展Collection或重新公開get(index) API。所以我不認爲有一個好的答案。作爲一條經驗法則,我儘可能不確定類型,直到我認識(並記錄)一些重要的特徵。例如,只要我希望方法知道插入順序被保留,我將從Collection更改爲List,並記錄爲什麼該限制很重要。同樣,如果從前面高效地移除變得重要,則從List移動到LinkedList

當涉及到在公開API中公開的集合時,我總是嘗試開始公開只有幾個預期會被使用的API;例如add(...)iterator()

0

它們完全相同。使用其中一個的唯一原因是,如果您稍後想要使用僅存在於類LinkedList中的列表函數,則需要使用第二個函數。

2
Collection list = new LinkedList(); //bad 

這是不好的,因爲,你不希望這個參考指說的HashSet的(如HashSet中還實現了採集等做許多其他類的在收集框架)。

LinkedList list = new LinkedList(); //bad? 

這是不好的,因爲好的做法是總是編碼到接口。

List list = new LinkedList();//good 

這是一件好事,因爲點2天,以便(Always Program To an Interface

+1

爲什麼使用List很好,使用Collection是不好的? – GraphicsToBe 2013-03-19 20:50:01

+0

@GraphicsToBe檢查我的編輯:) – PermGenError 2013-03-19 20:53:36

+1

@Aboutblank數組不是集合,也不是集合:) – PermGenError 2013-03-19 20:55:11

1

肯定。例如,如果java會爲List集合找到並實現更高效的實現,但是您已經擁有僅接受LinkedList的API,那麼如果您已經擁有該API的客戶端,則將無法替換實現。如果你使用接口,你可以輕鬆地替換實現而不會破壞API。

2

使用非公開對象的最具體類型的信息。它們是實現細節,我們希望我們的實現細節儘可能具體和精確。

0

我的一般規則只是當時你需要的具體細節(或者需要在不久的將來,在合理的範圍內)。當然,這有點主觀。

在你的例子,我通常會宣佈它作爲一個List只是因爲Collection可用的方法是不是很厲害,和List和另一CollectionMapSet等)之間的區別往往是在邏輯上顯著。

此外,在Java 1.5+中不使用原始類型 - 如果您不知道您的列表將包含的類型,請至少使用List<?>

+0

downvote的任何理由? – ach 2013-03-20 12:39:08

相關問題