在java中,HashSet是使用HashMap實現的。所以,當我們添加一個項目的集合下面的代碼被執行。使用HashMap實現HashSet是否存在問題?
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
時會發生什麼的兩個對象是不同的,但具有等於散列被添加到的HashSet;它會(HashSet)包含這兩個對象還是會發生什麼?
在java中,HashSet是使用HashMap實現的。所以,當我們添加一個項目的集合下面的代碼被執行。使用HashMap實現HashSet是否存在問題?
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
時會發生什麼的兩個對象是不同的,但具有等於散列被添加到的HashSet;它會(HashSet)包含這兩個對象還是會發生什麼?
hashmap使用.equals()
以及.hash()
。兩件事情是不一樣的,除非.equals()
返回true。 hashset也是如此。
所以如果兩個對象是不同的但具有相同的散列,它們都將被存儲,並且都可用,因爲.equals()
仍然會返回false
。
確實,在內部使用散列來決定存儲對象的位置,但仍然可以存儲具有相同散列的多個對象(由於它變得更加複雜,所以只是略有表現而已)。
是的,hashmap將包含這兩個元素。我無法找到它使用的具體方法,但處理衝突的流行方法包括爲每個桶使用鏈接列表,或僅將元素粘貼到附近的空桶中。
Java的HashMap實現實際上使用鏈接列表樣式結構(內部稱爲Entry)來表示一個存儲桶。以下表達式用於確定給定密鑰的桶:hashcode&(numBuckets-1)。完成後,使用.equals()檢查存儲區中的密鑰,並將元素替換或添加到該存儲區。 – Matt 2012-07-27 04:00:06