HashSet是一種Set的實現(xiàn).
為什么需要Set這種數(shù)據(jù)結(jié)構(gòu)呢?因為假設(shè)我們想要存儲不能重復(fù)的元素,我們會怎么做?會選擇哪種數(shù)據(jù)結(jié)構(gòu)?數(shù)組還是鏈表?
選用數(shù)組或者鏈表,我們都需要時間復(fù)雜度為O(n)的檢查操作來檢查元素有沒有重復(fù).
"等一下",你可能會說.
"我們可以選擇BST啊,這樣我們只需要時間復(fù)雜度為O(logn)的檢查操作."
確實可以這樣做,但是還有沒有更好的解決方案呢?
"當(dāng)然有", 你朋友說.
他又接著說:"我們之前有學(xué)過HashMap的,為什么不用HashMap來實現(xiàn)呢?這樣時間復(fù)雜度僅為O(1)啊."
你反駁說:"但是HashMap是鍵值對的形式呀,而我們這里只是單個數(shù)據(jù)的形式,又不是鍵值對的形式."
"用這個數(shù)據(jù)做key不就好了嘛,value隨便找個占位符放那兒不就完事了嘛!"
bingo!
就是這樣,HashSet內(nèi)部維護(hù)著一個HashMap,用這個HashMap存放實際的數(shù)據(jù).然后用我們想要插入的數(shù)據(jù)做key,再找一個對象做占位符,當(dāng)做value.
就是這么簡單.
HashSet中,可以存放null.因為HashMap中就允許null鍵值對存在.
另外,由于HashSet內(nèi)部的數(shù)據(jù)結(jié)構(gòu)為HashMap,所以你為HashSet設(shè)置的initial capacity以及load factor同樣會影響其性能.