HashMap、HashTable和TreeMap不同點(diǎn)

HashMap允許使用 null 值和 null 鍵,不保證映射的順序恒久不變。 迭代HashMap 實(shí)例所需時間與其容量及當(dāng)前關(guān)系數(shù)量大小成比例。HashMap 的實(shí)例有兩個參數(shù)影響其性能:初始容量 和加載因子。容量是哈希表中桶【可以理解為分區(qū)】的數(shù)量,初始容量只是哈希表在創(chuàng)建時的容量。加載因子是哈希表在其容量自動增加之前可以達(dá)到多滿的一種尺度。當(dāng)哈希表中的條目數(shù)超出了加載因子與當(dāng)前容量的乘積時,則要對該哈希表進(jìn)行 rehash 操作(即重建內(nèi)部數(shù)據(jù)結(jié)構(gòu)),從而哈希表將具有大約兩倍的桶數(shù)。默認(rèn)加載因子為0.75是在尋求時空的平衡,該因子過大,則查詢就慢,該因子過小,則需反復(fù)rehash。此實(shí)現(xiàn)不是同步的。若要實(shí)現(xiàn)HashMap同步,需要使用:

Map m = Collections.synchronizedMap(new HashMap(...));

HashMap中設(shè)置值的過程如下:第一步首先將k,v封裝到Node對象當(dāng)中(節(jié)點(diǎn))。第二步它的底層會調(diào)用K的hashCode()方法得出hash值。第三步通過哈希表函數(shù)/哈希算法,將hash值轉(zhuǎn)換成數(shù)組的下標(biāo),下標(biāo)位置上如果沒有任何元素,就把Node添加到這個位置上。如果說下標(biāo)對應(yīng)的位置上有鏈表。此時,就會拿著k和鏈表上每個節(jié)點(diǎn)的k進(jìn)行equal。如果所有的equals方法返回都是false,那么這個新的節(jié)點(diǎn)將被添加到鏈表的末尾。如其中有一個equals返回了true,那么這個節(jié)點(diǎn)的value將會被覆蓋。jdk7使用的是數(shù)組+鏈表來實(shí)現(xiàn),而jdk8使用數(shù)組+鏈表+紅黑樹實(shí)現(xiàn)。那為什么要引入紅黑樹呢,原因就是哪怕將hash的碰撞降到最低,也不能避免鏈表會越來越長。

HashTable與HashMap類似,但HashTable的大多數(shù)方法都是同步的,例如put和get兩方法都被修飾了synchronized關(guān)鍵字。

TreeMap實(shí)現(xiàn)了SortedMap,基于紅黑樹實(shí)現(xiàn),使得containsKey、get、put 和 remove 操作提供log(n) 時間開銷下的排序,即在這些方法執(zhí)行時完成基于key的自然排序或者根據(jù)Comparator重寫的方法進(jìn)行自定義排序。

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

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

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