更新時(shí)間:2021-05-08 10:55:28 來源:動(dòng)力節(jié)點(diǎn) 瀏覽974次
1.HashSet()
loadFactor默認(rèn)0.75,threshold為12
并創(chuàng)建一個(gè)大小為16的Entry對(duì)象數(shù)組
可調(diào)用另外兩個(gè)構(gòu)造器控制初始容量值,loadFactor
數(shù)組大小由如下決定:
capacity才是創(chuàng)建的Entry對(duì)象數(shù)組的大小,new HashMap(5,0.6),則設(shè)loadFactor為0.6,并創(chuàng)建一個(gè)大小為8的Entry對(duì)象數(shù)組,threshold則為4( 8 * 0.6 = 4 )
2.put(key, value)
key為null,獲取第一個(gè)Entry對(duì)象,并基于Entry的next遍歷
key不為null,獲取key的hashCode,然后再對(duì)此hashCode作hash操作,hash完成后,將hash值與對(duì)象數(shù)組len按位與,得到key要存儲(chǔ)的數(shù)組位置。
增加時(shí)獲取數(shù)組首個(gè)Entry:e,并創(chuàng)建Entry對(duì)象,key為null,value為傳入對(duì)象,next為e。
若數(shù)組len >= threshold,擴(kuò)容為2倍,擴(kuò)容前對(duì)所有元素重新hash,并填充數(shù)組,最后重設(shè)置threshold。
找到key為null,更新value,返回
未找到,增加Entry。
hash沖突:不同key找到相同存儲(chǔ)位置,通過調(diào)用Entry對(duì)象next遍歷鏈表的方式。
3.get(Object key)
與put一樣,根據(jù)key是否為null分別處理
key為null –> 首個(gè)Entry –> next遍歷
key非null –> hash和按位與 –> 找到位置 –> 找到Entry –> next遍歷
4.remove(Object key)
類似get,找到key,當(dāng)前元素更新為next元素
未找到,遍歷鏈表
5.containsKey(key)
調(diào)用getEntry,與get基本相同,返回是否為null
6.keySet()
用來遍歷Map對(duì)象,返回KeySet對(duì)象實(shí)例
調(diào)用iterator返回keyIterator,遍歷中有增刪會(huì)拋異常
HashMap采用數(shù)組方式存儲(chǔ)key,value構(gòu)成的Entry對(duì)象,無容量限制
HashMap基于key hash尋找Entry對(duì)象存放到數(shù)組的位置,對(duì)hash沖突采用鏈表的方式來解決
插入擴(kuò)容,擴(kuò)容時(shí)重hash,并復(fù)制對(duì)象到新的數(shù)組中
非線程安全
1.實(shí)現(xiàn)
支持排序的Map實(shí)現(xiàn),不同于HashMap
2.TreeMap()
將comparator屬性為null,若希望控制存儲(chǔ)順序,使用帶Comparator參數(shù)的構(gòu)造器
3.put(key, value)
判斷root是否為null
有,紅黑樹遍歷key,相等替換,不等找到null為止
無,判斷key是否為null
未找到相同的key,創(chuàng)建新的Entry,將其parent設(shè)置成上面所尋找到的元素并根據(jù)和parent key比較的情況來設(shè)置parent的left或right屬性
是,1.拋NullPointerException,2.并將key造型為Comparable,進(jìn)行與上面相同過程
否,執(zhí)行2
是,建新Entry,并賦給root
否,判斷有無實(shí)現(xiàn)Comparator
基于紅黑樹實(shí)現(xiàn),一定要有key比較,要么傳入Comparator實(shí)現(xiàn),要么key對(duì)象實(shí)現(xiàn)Comparable接口
4.get(Object)
紅黑樹查找,從根開始往下比,一直找到等key,返回其value
和put同樣的處理方式,如未傳入Comparator實(shí)現(xiàn),當(dāng)傳入的Object為null,拋異常
5.remove(O)
getEntry,并將Entry從紅黑樹上刪除,并重新調(diào)整樹上的相關(guān)結(jié)點(diǎn)。
6.containsKey(O)
同getEntry,但containsKey直接判斷返回的Entry是否為null
7.KeySet()
返回TreeMap的內(nèi)部類KeySet對(duì)象的實(shí)例,iterator的遍歷從根開始,基于紅黑樹順序完成。
TreeMap基于紅黑樹實(shí)現(xiàn),無容量限制
TreeMap非線程安全
以上就是動(dòng)力節(jié)點(diǎn)小編介紹的"Java Map集合的理解",希望對(duì)大家有幫助,如有疑問,請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為您服務(wù)。
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)