2014-02-23 359 views
92

在這個問題中How can I efficiently select a Standard Library container in C++11?是一個方便的流程圖,用於選擇C++集合。我應該使用什麼Java集合?

我認爲這是一個有用的資源,不知道他們應該使用哪個集合,因此我試圖找到類似的Java流程圖,但無法這樣做。

什麼資源和「備忘單」可用於幫助人們在Java編程時選擇正確的集合?人們如何知道他們應該使用什麼List,Set和Map實現?

回答

196

由於找不到類似的流程圖,我決定自己做一個。

該流程圖並不試圖掩蓋的東西一樣同步訪問,線程安全等或傳統的集合,但它確實涵蓋3個標準設置 S,3個標準地圖 s和標準名單小號。

enter image description here

這個影像對於這個答案創建並下Creative Commons Attribution 4.0 International License.最簡單的歸屬許可是通過鏈接要麼這個問題或這個答案。

其他資源

可能是最有用的其它參考是從描述每個Collection Oracle文檔以下頁面。

HashSet的VS TreeSet的

有何時使用HashSetTreeSet這裏詳細討論: Hashset vs Treeset

的ArrayList VS LinkedList的

詳細討論:When to use LinkedList over ArrayList?

+0

不錯!但我不同意你的'LinkedList'與'ArrayList'的決定。首先,如果列表的大小很大,那麼最好使用LinkedList。 'LinkedList'具有每個元素的開銷,所以它在內存消耗方面比'ArrayList'漸近。另外,如果大部分訪問都在列表的末尾,那麼'ArrayList'是最好的,因爲它提供了恆定時間的隨機元素訪問。訪問「LinkedList」的第n個元素是一個「O(n)」操作。 ...實際上,使用鏈表的決定應該幾乎是「不」。 –

+2

@MattBall我很同意你的看法。然而Java'LinkedList'是一個雙鏈表,所以在開始和結束時訪問都很快。你會注意到,在推薦使用'LinkedList'之前,所有三個問題都必須回答yes,所以換句話說,我同意你的觀點,在大多數情況下,答案是否定的。諸如隊列和出隊之類的事情,你不斷地在列表的末尾添加和刪除東西,這些都是對LinkedList很好的用例。 –

+0

@MattBall內存使用情況是一個更棘手的情況,因爲當一個LinkedList對每個元素使用更多內存時...... ArrayList從不釋放內存。這意味着如果你有一個列表有時會增長到一個很大的大小,但通常很小,那麼'ArrayList'會給內存帶來更糟的性能。與其包含的元素相比,「List」本身的內存開銷通常(雖然不總是)很小。 –

7

甚至s執行圖片在這裏。故意簡化!

  1. 收集是任何保持數據稱爲 「元素」(同一類型的)。沒有更具體的假設。

  2. 列表索引集合,其中每個元素有一個索引數據。像數組一樣,但更靈活。

    列表中的數據保持插入順序。

  3. 袋元件,每個元素僅僅一次(其中的元件使用他們equals()方法有區別的。

    設置中的數據主要存儲只是爲了知道什麼數據在那裏。

  4. 地圖是類似的名單,但不是由他們的整數索引訪問元素,您可以通過他們的關鍵訪問它們,這是任何對象。就像PHP中的數組:)

    地圖中的數據可以通過其密鑰進行搜索。

    設置和地圖之間的主要不同的是,在設置你搜索數據自己,而在地圖通過他們的關鍵

0

這很簡單:如果你需要存儲值映射到它們的密鑰去Map接口,否則使用清單可以重複值和最終使用Set接口,如果你不想重複值在您的收藏。

下面是完整解釋​​,包括流程圖等

40

主要非併發的,非同步的集合內容

Collection:表示項目的無序「袋」的接口,被稱爲「元件」。 「下一個」元素是未定義的(隨機)。

  • Set:代表Collection沒有重複的接口。
    • HashSet:A Set支持Hashtable。訂購時最快和最小的內存使用量並不重要。
    • LinkedHashSet:A HashSet增加了一個鏈接列表來關聯中的元素插入順序。 「下一個」元素是下一個最近插入的元素。
    • TreeSet:A Set其中元件按Comparator(通常爲natural ordering)排序。最慢和最大的內存使用情況,但對於基於比較器的排序而言是必需的
    • EnumSet:爲單枚枚舉類型定製的極其快速高效的Set
  • List:表示的接口的Collection其元素是有序的,並且每個具有表示其位置,其中零是第一要素,和(length - 1)是最後一個數字索引。
    • ArrayList:甲List由陣列,其中所述陣列具有的長度(所謂的「容量」),其是至少爲(列表的「尺寸」)元件的數量一樣大的支持。當尺寸超過容量時(添加(capacity + 1)-th元素時),將以新容量(new length * 1.5)重新創建陣列 - 由於使用System.arrayCopy(),因此重新創建速度很快。刪除和插入/添加元素需要將所有相鄰元素(右側)移入或移出該空間。訪問任何元素都很快,因爲它只需要計算(element-zero-address + desired-index * element-size)就可以找到它的位置。 In most situationsArrayList優於LinkedList
    • LinkedList:A List由一組對象支持,每個對象鏈接到它的「上一個」和「下一個」鄰居。 A LinkedList也是QueueDeque。訪問元素從第一個或最後一個元素開始,遍歷直到達到所需的索引。插入和刪除,一旦通過遍歷達到所需的索引,則只需將直接相鄰鏈接重新映射爲指向新元素或繞過現在刪除的元素,這是一件微不足道的事情。
  • Map:代表Collection的界面,其中每個元素都有一個標識「鍵」 - 每個元素都是一個鍵值對。
    • HashMap:A Map其中密鑰是無序的,並且由Hashtable支持。
    • LinkedhashMap:鑰匙按訂購
    • TreeMap:A Map其中密鑰按Comparator(通常爲自然順序)排序。
  • Queue:一個表示Collection其中元素,典型地,加入到一個端部,並從另一個(:先入先出FIFO)去除的接口。
  • Stack:代表Collection的接口,其中通常從相同的末端(LIFO:後進先出)添加(推送)和移除(彈出)元素。
  • Deque:「雙排隊列」的縮寫,通常發音爲「甲板」。通常只添加到任一端(並非中間)並從中讀取的鏈接列表。

基本集合圖:

diagram

元素的插入與ArrayListLinkedList比較:

diagram

+1

最好總結一下,你可以在任何地方:) – roottraveller

+0

你應該添加'Vector','HashTable'和'PriorityQueue' ... – roottraveller

相關問題