2009-05-04 70 views
33

Java中的SetCollection之間是否有任何實際區別,除了Collection可以包含兩次相同的元素?他們有相同的方法。何時使用Set與Collection?

(例如,不Set給我更多的選擇使用哪一個接受Set工具庫但不Collection S')

編輯:我能想到的至少5分不同的情況來判斷這個問題。其他人能想出更多嗎?我想確保我理解這裏的微妙之處。

  1. 設計接受參數SetCollection的參數的方法。 Collection更一般,接受更多的輸入可能性。 (如果我正在設計特定的班級或界面,則我對用戶更爲友善,如果我使用Collection,則對我的子用戶/實施者更爲嚴格。)
  2. 設計一種返回SetCollection的方法。 Set提供比Collection更多的保證(即使它只是保證不包含一個元素兩次)。 (如果我正在設計一個特定的類或接口,如果我使用Set,那麼對於我的消費者來說我會更好,並且對我的子類/實現者更嚴格。)
  3. 設計實現接口SetCollection的類。與#2類似的問題。我的類/接口的用戶可以獲得更多的保證,子類/實施者有更多的責任。
  4. 設計一個擴展接口SetCollection的接口。與#3非常相似。
  5. 書寫使用SetCollection的代碼。在這裏我不妨使用Set;我使用Collection的唯一理由是如果我從其他人的代碼中取回Collection,或者我必須處理包含重複項的集合。
+1

很好的問題,但恕我直言不力的答案 – Kemoda 2013-08-30 06:26:34

回答

37

Collection也是ListQueueDeque,和其他的超類型,因此它爲您提供了更多的選擇。例如,我嘗試使用Collection作爲庫方法的參數,它們不應該明確依賴於某種類型的集合。

一般來說,您應該使用正確的工具進行工作。如果您不想重複,請使用Set(或SortedSet如果您想要訂購,或者LinkedHashSet如果您想維護廣告訂單)。如果您想允許重複項,請使用List,依此類推。

+1

如何使用集合給你*更多*選項?使用更一般的東西通常會減少*力量。 – Martijn 2009-05-04 19:14:17

+5

它給調用一個採用Collection作爲參數的方法的人提供了更多選擇,因爲他們可以傳遞List,Set或Queue而不必進行任何轉換。 – 2009-05-04 19:20:54

+4

是的,我從撰寫接受收藏的方法的人的角度講話。正如我所說的,對於返回*的方法,我更喜歡使用適當的類型來完成這項工作。 – 2009-05-04 19:30:19

3

請參閱Java的Collection tutorial,以便更好地瞭解Collection的使用情況。特別是,請查看類的層次結構。

8

我想你已經想通了一個Set當你想明確排除重複。 Collection通常是最低公分母,並且指定接受/返回此API的API會很有用,這會在稍後根據需要留出空間來更改詳細信息。但是,如果您的應用程序的詳細信息需要唯一條目,請使用Set來執行此操作。

另外值得考慮的是訂單對你是否重要;如果是,請使用ListLinkedHashSet如果您關心的是訂單的唯一性。

1

當你想要的時候,你應該使用Set。

例如,沒有任何訂單或重複的列表。像contains這樣的方法非常有用。

集合更通用。我相信戴維斯在他們的用法上寫了什麼說明了這一切。

2

正如@ mmyers所述,Collection包括Set和List。

當你將某些東西聲明爲一個Set而不是一個Collection時,你說這個變量不能是一個List或一個Map。但它始終是一個集合。因此,任何接受集合的函數都會接受集合,但接受集合的函數不能採集集合(除非將其轉換爲集合)。

1

實際區別在於Set強制執行集合邏輯,即沒有重複和無序,而集合沒有。所以,如果你需要一個集合,你沒有特別的要求避免重複,那麼使用一個集合。如果你有Set的需求,那麼使用Set。通常使用最高的接口可能性。

2

要考慮的另一件事...集合在時間,內存和編碼方面有額外的開銷,以保證沒有重複。 (時間和內存,因爲集合通常由HashMap或Tree支持,這會增加列表或數組的開銷。因爲您必須實現hashCode()和equals()方法,因此編碼。)

我通常使用當我需要一個快速實現的contains()時,設置集合或列表,否則,即使集合不應該有重複。

0

由於集合是Set和SortedSet的超類型,所以這些可以傳遞給期望集合的方法。集合意味着它可能會或可能不會被分類,排序或允許重複。

相關問題