2011-01-14 58 views
1

可能重複:
Why does HashSet implementation in Sun Java use HashMap as its backing?爲什麼HashSet的作爲HashMap的內部實現

我知道一個HashSet和HashMap是 - 他們很精通。有一件事讓我很困惑。

例子:

Set <String> testing= new HashSet <String>(); 

現在,如果你使用eclipse右邊的上述發言後,調試器的變量選項卡下調試它,你會注意到一組「測試」內部作爲一個HashMap實現。

爲什麼它需要一個HashMap,因爲有參與套收集

+3

可能的重複[爲什麼Sun Java中的HashSet實現使用HashMap作爲其支持](http://stackoverflow.com/questions/2235546/why-does-hashset-implementation-in-sun-java-use-hashmap -as-其背襯) – justkt 2011-01-14 15:13:40

回答

2

這是一個實現細節沒有鑰匙,值對。 HashMap實際上用作HashSet的後備存儲。 From the docs

此類實現Set接口,由哈希表(實際上是一個HashMap實例)支持。它對集合的迭代次序沒有任何保證;特別是,它不能保證訂單會隨着時間的推移保持不變。這個類允許null元素。

(重點煤礦)

1

的答案是正確的API文檔

「這個類實現Set接口,由哈希表(實際上是一個HashMap實例)支持。它不保證關於該集合的迭代順序;特別是,它不能保證順序將隨着時間保持恆定,該類允許空元素

該類爲基本操作提供恆定的時間性能(添加,刪除,包含和大小),假設哈希fu將元素正確分散在桶中。迭代此集合需要的時間與HashSet實例的大小(元素數量)加上支持HashMap實例的「容量」(桶的數量)的總和成正比。因此,不要將初始容量設置得太高(或負載因數過低),如果迭代性能很重要,非常重要。」

所以你甚至不需要調試器知道這一點。

在回答你的問題:它是一個實現的細節,它不需要需要來使用HashMap,但它可能只是很好的代碼重用,如果你仔細想一想,在這種情況下唯一的區別就是Set與地圖有不同的語義,即地圖有get(key)方法,而sets不允許重複,地圖允許重複值,但它們必須在不同的鍵之下。使用HashMap作爲HashSet的支持可能非常容易,因爲您只需要在要放入Set中的值上使用hashCode(在所有對象上定義)來確定是否使用了一個Hadoop,即,它可能只是做類似

backingHashMap.put(toInsert.hashCode(), toInsert); 

將項目插入集。

0

在大多數情況下,Set被實現爲Map的keySet()的包裝。這避免了重複的實現。如果你看看源代碼,你會看到它是如何做到這一點的。

例如,您可能會發現可用於包裝ConcurrentHashMap的方法Collections.newSetFromMap()。

0

類的Javadoc的第一句話說,它是由HashMap支持:

此類實現Set接口,由哈希表(實際上是一個HashMap實例)支持。

如果你看一下HashSet的源代碼,你會看到,它存儲在地圖的關鍵是你正在使用的條目,該值是一個單純的標誌Object(命名爲PRESENT )。

它爲什麼支持HashMap?因爲這是將一組項目存儲在(概念性)散列表中的最簡單方法,並且不需要HashSet重新發明散列表數據結構的實現。

0

這只是一個方便事情,標準的Java類庫工具HashSet使用HashMap - 他們只需要實現一個數據結構,然後HashSet存儲其與實際的對象集的密鑰和一個HashMap數據虛擬值(通常爲Boolean.TRUE)作爲值。

0

HashMap已經具備了HashSet所需的全部功能。沒有意義重複相同的算法。

0

它允許您輕鬆快速地確定某個對象是否已經在該集合中。

相關問題