Hashtable、HashMap、TreeMap总结
生活随笔
收集整理的這篇文章主要介紹了
Hashtable、HashMap、TreeMap总结
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Hashtable、HashMap、TreeMap總結(jié)
三者均實(shí)現(xiàn)了Map接口,存儲(chǔ)的內(nèi)容是基于key-value的鍵值對(duì)映射,一個(gè)映射不能有重復(fù)的鍵,一個(gè)鍵最多只能映射一個(gè)值。
(元順初線)
(1) 元素特性
HashTable中的key、value都不能為null;HashMap中的key、value可以為null ,很顯然只能有一個(gè)key為null的鍵值對(duì),但是允許有多個(gè)值為null的鍵值對(duì); TreeMap中當(dāng)未實(shí)現(xiàn) Comparator 接口時(shí),key 不可以為null;當(dāng)實(shí)現(xiàn) Comparator 接口時(shí),若未對(duì)null情況進(jìn)行判斷,則key不可以為null,反之亦然。
(2)順序特性
HashTable、HashMap具有無(wú)序特性 。 TreeMap是利用紅黑樹(shù)來(lái)實(shí)現(xiàn)的(樹(shù)中的每個(gè)節(jié)點(diǎn)的值,都會(huì)大于或等于它的左子樹(shù)種的所有節(jié)點(diǎn)的值,并且小于或等于它的右子樹(shù)中的所有節(jié)點(diǎn)的值 ),實(shí)現(xiàn)了SortMap接口,能夠?qū)Ρ4娴挠涗浉鶕?jù)鍵進(jìn)行排序。所以一般需要排序的情況下是選擇TreeMap來(lái)進(jìn)行,默認(rèn)為升 序排序方式(深度優(yōu)先搜索) ,可自定義實(shí)現(xiàn)Comparator接口實(shí)現(xiàn)排序方式。
(3)初始化與增長(zhǎng)方式
初始化時(shí): HashTable在不指定容量的情況下的默認(rèn)容量為11 ,且不要求底層數(shù)組的容量一定要為 2的整數(shù)次冪 ; HashMap 默認(rèn)容量為 16 ,且要求容量一定為 2的整數(shù)次冪 。
擴(kuò)容時(shí): Hashtable將容量變?yōu)樵瓉?lái)的2倍加1;HashMap擴(kuò)容將容量變?yōu)樵瓉?lái)的2倍。
(4)線程安全性
HashTable其 方法函數(shù)都是同步 的(采用synchronized修飾),不會(huì)出現(xiàn) 兩個(gè)線程同時(shí)對(duì)數(shù)據(jù) 進(jìn)行操作的情況,因此保證了線程安全性。也正因?yàn)槿绱?#xff0c;在多線程運(yùn)行環(huán)境下效率表現(xiàn)非常低下。因?yàn)楫?dāng)一個(gè)線程訪問(wèn)HashTable的同步方法時(shí),其他線程也訪問(wèn)同步方法就會(huì) 進(jìn)入阻塞狀態(tài) 。比如當(dāng)一個(gè)線程在 添加數(shù)據(jù)時(shí)候 ,另外一個(gè)線程即使執(zhí) 行獲取其他數(shù)據(jù)的操作 也必須被阻塞,大大降低了程序的運(yùn)行效率,在新版本中已被廢棄,不推薦使用。
HashMap不支持線程的同步,即任一時(shí)刻可以有多個(gè)線程同時(shí)寫(xiě)HashMap;可能會(huì)導(dǎo)致數(shù)據(jù)的不一致。如果需要同步(1)可以用 Collections的 synchronizedMap 方法;(2)使用 ConcurrentHashMap 類(lèi), 相較于HashTable鎖住的是對(duì)象整體, ConcurrentHashMap基于lock實(shí)現(xiàn)鎖分段技術(shù) 。首先將Map存放的 數(shù)據(jù)分成一段一段的存儲(chǔ)方式 ,然后給每一段數(shù)據(jù) 分配一把鎖 ,當(dāng)一個(gè)線程占用鎖訪問(wèn)其中一個(gè)段的數(shù)據(jù)時(shí),其他段的數(shù)據(jù)也能被其他線程訪問(wèn)。ConcurrentHashMap不僅保證了多線程運(yùn)行環(huán)境下的數(shù)據(jù)訪問(wèn)安全性,而且性能上有長(zhǎng)足的提升。
(5)一段話HashMap
HashMap基于哈希思想,實(shí)現(xiàn)對(duì)數(shù)據(jù)的讀寫(xiě)。當(dāng)我們將鍵值對(duì)傳遞給put()方法時(shí),它調(diào)用鍵對(duì)象的hashCode()方法來(lái)計(jì)算hashcode,讓后找到bucket位置來(lái)儲(chǔ)存值對(duì)象。當(dāng)獲取對(duì)象時(shí),通過(guò)鍵對(duì)象的equals()方法找到正確的鍵值對(duì),然后返回值對(duì)象。HashMap使用鏈表來(lái)解決碰撞問(wèn)題,當(dāng)發(fā)生碰撞了,對(duì)象將會(huì)儲(chǔ)存在鏈表的下一個(gè)節(jié)點(diǎn)中。 HashMap在每個(gè)鏈表節(jié)點(diǎn)中儲(chǔ)存鍵值對(duì)對(duì)象。當(dāng)兩個(gè)不同的鍵對(duì)象的hashcode相同時(shí),它們會(huì)儲(chǔ)存在同一個(gè)bucket位置的鏈表中,可通過(guò)鍵對(duì)象的equals()方法用來(lái)找到鍵值對(duì)。如果鏈表大小超過(guò)閾值(TREEIFY_THRESHOLD, 8),鏈表就會(huì)被改造為樹(shù)形結(jié)構(gòu)。
總結(jié)
以上是生活随笔為你收集整理的Hashtable、HashMap、TreeMap总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: LeetCode算法入门- Remove
- 下一篇: 双剑合璧————Spring Boot