2011-01-05 69 views
3

我一直想知道從java.util的地圖。來自Java的地圖接口問題

爲什麼values()方法返回一個Collection,而keySet和entrySet返回一個Set?

Set和Collection的優點和缺點是什麼?

+0

如果Java有'Bag'類型,這在這裏更合適。 – skaffman 2011-01-05 16:02:13

回答

6

一套保證定條目只能一次存在。一個集合不。由於一個Map沒有值的唯一性保證,它們的集合根本不是一個集合,但必須是一個集合。

+2

準確地說 - 雖然鍵的集合和條目集合不能有重複,因此可以聲明爲Set。 – 2011-01-05 16:01:46

4

地圖內部管理密鑰集,因爲鍵是唯一值不

返回包含在此映射中鍵的Set視圖。該集合由地圖支持,因此對地圖的更改反映在集合中,反之亦然。如果在對集合進行迭代的過程中修改了映射(除了通過迭代器自己的刪除操作),迭代的結果是未定義的。該集支持元素刪除,通過Iterator.remove,Set.remove,removeAll,retainAll和clear操作從映射中刪除相應的映射。它不支持add或addAll操作。

請參見

+0

我會這樣說:「鍵必須是唯一的,值不必是」。 – duffymo 2011-01-05 16:00:44

+1

@duffymo檢查更新,希望這是更好 – 2011-01-05 16:01:34

+0

你原來還好,org.life.java。我在言語上嘀咕。你的完全正確。 – duffymo 2011-01-05 18:16:43

2

A Set是不包含重複元素的Collection。在可能的情況下返回Set的好處是可以明確地保證唯一性。

正如其他人指出的,values()無法返回Set,因爲值的集合可能包含重複項。

6

這不是一個真正的優勢和劣勢問題 - 這是map的關鍵,值和條目代表的重要性。

鍵在地圖上是獨一無二的

Map的關鍵是獨特的 - 也就是說,有不會是在Map重複鍵。 A Collection確保重複不存在是Set

因此,通過keySet方法將密鑰作爲Set返回。

值在地圖不一定是唯一

在另一方面,Mapvalues不必是唯一的。

例如,我們可以有與關鍵"fruit"地圖的價值"apple"映射中的項,並且還具有與關鍵"computer"映射另一個入口的價值"apple"

map { 
    key:"fruit" -> value:"apple" 
    key:"computer" -> value:"apple" 
} 

具有重複的值一張地圖是允許的。

因此,我們不能使用Set,因爲這需要所有條目都是唯一的。 Map的值的一個很好的選擇是返回一個普通的舊Collection,因爲它不會對值的內容施加任何限制。

條目中的地圖也很獨特

Map的條目是獨特 - 它們是鍵和值,由Map.Entry對象表示的組合。由於此鍵值對是唯一的,因此通過entrySet方法將其作爲Set返回。

進一步閱讀

2

值()可以是複製,所以它是Collection

keySet()和entrySet()不能重複,因此它們是Set

ps:Set是非重複的Collection