2010-08-18 65 views
8

假設您需要在Collection中存儲/檢索項目,不需要關注訂購,並且允許重複,您使用的是什麼類型的Collection默認集合類型

默認情況下,我一直使用ArrayList,但我記得在某處執行Queue實施可能是一個更好的選擇。 A List允許在任意位置添加/檢索/移除項目,這導致性能損失。由於Queue不提供此功能,因此在不需要此功能時理論上應該更快。我認識到所有關於表現的討論都有些沒有意義,唯一真正重要的是測量。不過,我很想知道其他人使用Collection時,他們不關心訂購,並允許重複,和爲什麼

回答

1

作爲默認設置,我傾向於選擇LinkedListArrayList。顯然,我不是通過List接口使用它們,而是通過Collection接口。我確實發現,當我需要一個泛型集合時,或多或少地放入一些東西,然後迭代它。如果我需要更多的進化行爲(比如說隨機訪問,排序或唯一性檢查),那麼我可能會更改已使用的實現,但在此之前,我會將使用的接口更改爲最適用的接口。這樣,我可以確保以前提供的功能專注於優化和實施。

+0

在「LinkedList」上搜索可能很昂貴,或者在特定索引處獲取值 - 你需要每次遍歷列表。 – 2010-08-18 08:49:21

+0

那麼,在LinkedList中搜索O(n),就像在ArrayList中搜索一樣,因爲這些都沒有排序。如前所述,我通過Collection接口使用它們,因此我無法訪問索引訪問方法(在這種情況下,它是一個功能)。 – Riduidel 2010-08-18 09:30:05

1

ArrayList基本上包含一個數組(這就是爲什麼稱爲ArrayList)。像任意位置的addd/remove這樣的操作都是直接完成的,所以如果你不使用它們 - 對性能沒有任何壞處。

+1

直截了當意味着轉移。也就是說,在任意位置添加/刪除的是'O(N)',而'ArrayList'不是'O(1)'。只是澄清。 – polygenelubricants 2010-08-18 09:42:30

0

如果排序和複製是不是一個問題,情況是僅用於存儲,

我用ArrayList,因爲它實現了所有的列表操作。從未感受到這些操作的任何性能問題(從不影響我的項目)。其實使用這些操作有簡單的用法&我不需要關心它是如何在內部管理的。

只有當多個線程將訪問此列表我使用Vector,因爲它的方法是同步的。

另外ArrayList和Vector是你首先學習的集合:)。

+0

對於大多數用法,我相信CopyOnWriteArrayList是一個更好的線程安全實現列表 – 2010-08-18 08:41:56

+0

「我使用ArrayList,因爲它實現了所有列表操作。」。但是我描述的用例不需要任何List操作,只需要Collection方法。 – 2010-08-18 08:44:19

+0

雅我錯了。刪除它。我的意思是,除了Collections方法以外,這些方法是有用的。 – YoK 2010-08-18 08:50:57

8

「這取決於」。你真的需要首先回答的問題是「我想用什麼收集?」

如果您經常在某一端(開始,結束)插入/移除項目,Queue將比ArrayList更好。但是,在很多情況下,您只需創建一個集合即可從中讀取。在這種情況下,ArrayList效率更高:因爲它是以數組的形式實現的,所以可以非常高效地對它進行迭代(同樣適用於LinkedList)。然而,LinkedList使用引用將單個項目鏈接在一起。因此,如果你不需要隨機刪除項目(在中間),ArrayList更好:ArrayList將使用較少的內存,因爲項目不需要存儲引用下一個/ prev項目的存儲。

概括起來:

ArrayList =好,如果你插入一次,並經常閱讀(隨機訪問或順序)

LinkedList =好,如果你插入/常在隨機位置刪除和只讀順序

ArrayDeque(只的Java6)如果插入/在開始/結束刪除和讀取隨機或順序

0

這取決於你知道它是什麼=好。

如果我沒有線索,我傾向於尋找一個鏈表,因爲最後添加/刪除的懲罰是恆定的。如果我對它的最大尺寸有一個大概的瞭解,我會選擇一個具有指定容量的數組列表,因爲如果估計好的話它會更快。如果我真的知道確切的大小,我傾向於選擇一個正常的數組;儘管這不是真正的集合類型。

0

我意識到所有關於表現的討論都有些沒有意義,唯一重要的是測量。

這不一定是正確的。

如果你知道應用程序如何工作告訴你某些集合將會非常大,那麼選擇正確的集合類型是一個好主意。但是正確的收集類型取決於關鍵是關於收集將如何使用;即在算法上。

例如,如果你的應用程序可能通過測試來支配,如果一個集合包含給定的對象,事實上,Collection.contains(Object)O(N)兩個LinkedList<T>ArrayList<T>威力意味着既不是一個適當的集合類型。相反,也許你應該將集合表示爲HashMap<T, Integer>,其中Integer表示「集合」中T的出現次數。這會給你O(1)測試和刪除,代價是更多的空間開銷和更慢(儘管仍然是O(1))插入。

但是需要強調的是,如果您可能正在處理的是非常大的集合,那麼不應該有這種「默認」集合類型。您需要在算法的上下文中考慮集合。 (另一方面,如果收藏總是很小,那麼您選擇的收藏類型可能沒什麼區別)。