2015-04-05 90 views
3

我對java中的HashSetHashMap的內部實現有點困惑。HashSet和HashMap如何在Java中工作?

這是我的理解,所以請糾正我,如果我錯了:

無論HashSetHashMap允許重複的元素。

HashSetHashMap支持,所以在HashSet當我們調用.add(element),我們呼籲的元素有關的hashCode()方法並在內部做了put(k,v)到內部HashMap,這裏的關鍵是hashCode和值是實際的對象。因此,如果我們嘗試將相同的對象添加到Set,它會看到hashCode已經存在,然後用新值替換舊值。

但是,然後,當我讀HashMap如何將我們自己的對象作爲密鑰存儲在HashMap中時,這似乎與我不一致。 在這種情況下,我們必須重寫hashCode()equals()方法,使它們相互之間是一致的,因爲,如果我們發現鍵與同hashCode,他們會去同一個桶,然後將所有具有相同的條目區分hashCode我們必須迭代條目列表以調用每個鍵上的方法equals()並找到匹配項。 因此,在這種情況下,我們允許擁有相同的hashCode,並且我們創建了一個存儲桶,其中包含與所有對象相同的列表hashCode,但是使用HashSet,如果我們發現已經有hashCode,我們用舊的值替換新值值。

我有點糊塗了,可能有人澄清這對我好嗎?

回答

7

你是正確的關於HashMap的行爲,但你錯了關於HashSet實施。

HashSet由內部一HashMap的支持,但要添加到HashSet的元件被用作在背襯HashMap的關鍵。對於該值,使用虛擬值。因此HashSetcontains(element)只是簡單地稱爲支持HashMapcontainsKey(element)