面試精選11-談HashSet的工作原理
HashSet的存儲原理或者工作原理,主要是從如何保證唯一性來說起。
這里面主要有3個問題,需要回答?
第一,為什么要采用Hash算法?有什么優(yōu)勢,解決了什么問題?
第二,所謂哈希表是一張什么表?
第三,HashSet如何保證保存對象的唯一性?會經(jīng)歷一個什么樣的運算過程?
大家可以先思考,下面來看解讀!
第一,為什么要采用Hash算法?有什么優(yōu)勢,解決了什么問題?
解決的問題是唯一性判斷的效率問題,保證為O(1)的復雜度
其存儲數(shù)據(jù)的底層結(jié)構(gòu)采用的是數(shù)組
當我們往數(shù)組放數(shù)據(jù)的時候,你如何判斷是否唯一?
可以采用遍歷的方式,逐個比較,但是這種效率低,尤其是數(shù)據(jù)很多的情況下,時間復雜度為O(n)
所以,為了解決這個效率低的問題,我們采用新的方式
采用hash算法的關(guān)鍵,是通過調(diào)用存儲對象的hashcode方法得到一個數(shù)值,然后再根據(jù)這個數(shù)值,經(jīng)過一通復雜的固定運算規(guī)則,得到我們要存儲在數(shù)組的下標,如果此時計算的下標位置沒有其他元素,則直接存儲,不用比較,所以最佳的效果可以達到O(1)
此處,我們只會用到hashCode
但是隨著元素的不斷添加,就可能出現(xiàn)“哈希沖突”,不同的對象計算出來的hash值是相同的,這個時候,我們就需要比較,才需要用到equals方法
如果equals相同,則不插入,不相等,則形成鏈表
第二,所謂哈希表是一張什么表?
本質(zhì)是一個數(shù)組,而且數(shù)組的元素是鏈表
以上是JDK1.7的版本實現(xiàn)
在JDK1.8版本之后做了優(yōu)化
優(yōu)化點:隨著元素不斷添加,鏈表可能會越來越長,那么再遍歷鏈表的效率也會下降,所以會優(yōu)化為紅黑樹,具體這個閾值是什么?
大家可以查看下源碼,印象更深刻!