Java集合框架源碼研讀-HashSet

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同樣會影響其性能.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容