HashSet與HashMap的區別

2021-09-01 18:25:59 字數 1516 閱讀 4746

hashset 集合不允許儲存相同的元素, 它底層實際上使用 hashmap 來儲存元素的, 不過關注的只是key元素, 所有 value元素預設為 object類物件.

hashset 的構造方法

//hashset底層用來儲存元素的結構,實際上使用hashmap來儲存

private transient hashmapmap;

//hashmap中的value值,hashset只關注key值,所以所有的value值都為object物件

private static final object present = new object();

//hashset的無參構造,直接建立了乙個hashmap物件

public hashset()

//指定初始化容量和負載因子

public hashset(int initialcapacity, float loadfactor)

//給定初始化容量

public hashset(int initialcapacity)

public hashset(collection extends e> c)

可以看到 hashset的構造方法底層都是呼叫 hashmap的構造方法, 所以hashset底層實際上是使用 hashmap 來作為儲存結構.

當使用無參構造建立 hashset物件時, 其實呼叫了 hashmap的無參構造建立了乙個 hashmap物件, 所以 hashset 的初始化容量也為16, 負載因子也為 0.75.

再來看看 hashset 的 add() 方法的實現:

可以看到 hashset 的 add() 方法底層實際也是呼叫了 hashmap 的 put() 方法, 這裡的key為我們傳入的將要新增到 set集合中的元素, 而value值則為 persent,其實就是上面分析的 hashset類中的乙個靜態字段, 預設為 object物件.

hashset並不關注value元素, 只使用 hashmap來儲存 key元素, 這就使得 hashset判斷元素相等的條件與 hashmap中 key相等的條件其實是一樣的, 兩個元素的 hashcode值相同且通過equals()方法比較返回 true.

所以hashset應該重寫 equals()和hashcode()方法, 兩個元素的 hashcode相同, 保證通過equals() 方法比較返回 true.

(1)hashset實現了set介面, 僅儲存物件; hashmap實現了 map介面, 儲存的是鍵值對.

(2)hashset底層其實是用hashmap實現儲存的, hashset封裝了一系列hashmap的方法. 依靠hashmap來儲存元素值,(利用hashmap的key鍵進行儲存), 而value值預設為object物件. 所以hashset也不允許出現重複值, 判斷標準和hashmap判斷標準相同, 兩個元素的hashcode相等並且通過equals()方法返回true.

HashSet與HashMap的區別

面試中經常被問到hashmap與hashset的區別。於是本渣靜下心來總結了一下hashset與hashmap的區別。先了解一下hashmap跟hashset hashset hashset實現了set介面,它不允許集合中出現重複元素。當我們提到hashset時,第一件事就是在將物件儲存在 hash...

HashMap與HashSet的區別

hashset hashset實現了set介面,它不允許集合中出現重複元素。當我們提到hashset時,第一件事就是在將物件儲存在 hashset之前,要確保重寫hashcode 方法和equals 方法,這樣才能比較物件的值是否相等,確保集合中沒有 儲存相同的物件。如果不重寫上述兩個方法,那麼將使...

HashSet 與HashMap底層實現

1.hashset底層通過包裝hashmap來實現,hashset在新增乙個值的時候,實際上是將此值作為hashmap中的key來進行儲存。2.hashmap的底層實現是通過初始化化乙個entry陣列來實現key value的儲存。3.在hashmap的entry中有四個變數,key value h...