Java 8 中 HashMap 到底有啥不同?

作者:廢物大師兄
來源:www.cnblogs.com/cjsblog/p/8207211.html

JDK1.8中的HashMap實現(xiàn)跟JDK1.7中的實現(xiàn)有很大差別。
下面分析JDK1.8中的實現(xiàn),主要看put和get方法。


構(gòu)造方法的時候并沒有初始化,而是在第一次put的時候初始化:

putVal方法的主要邏輯是這樣的:
1、如果數(shù)組還沒有初始化(數(shù)組長度是0),則先初始化
2、通過hash方法計算key的hash值,進(jìn)而計算得到應(yīng)該放置到數(shù)組的位置
5、如果是鏈表,則遍歷鏈表,如果找到相等的元素則替換,否則插入到鏈表尾部
6、如果鏈表的長度大于或等于8,則將鏈表轉(zhuǎn)成紅黑樹

1、計算hash求位置
2、看第一個元素是不是要找的,是則返回,否則遍歷

擴(kuò)容就是將舊數(shù)組的元素移動到新數(shù)組。
總結(jié):
1、HashMap底層是用數(shù)組+雙向鏈表+紅黑樹實現(xiàn)的
2、插入元素的時候,首先通過一個hash方法計算得到key的哈希值,進(jìn)而計算出待插入的位置
3、如果該位置為空,則直接插入(包裝成Node)
4、如果該位置有值,則依次遍歷。比較的規(guī)則是,hash值相同,key值相等的元素視為相同,則用新值替換舊值并返回舊值。
5、如果該位置的元素是紅黑樹結(jié)構(gòu),則同理,查找,找到則替換,沒找到則插入。
劃重點:
JDK1.8中HashMap與JDK1.7中有很多地方不一樣
1、1.8中引入了紅黑樹,而1.7中沒有
2、1.8中元素是插在鏈表的尾部,而1.7中新元素是插在鏈表的頭部
3、擴(kuò)容的時候,1.8中不會出現(xiàn)死循環(huán),而1.7中容易出現(xiàn)死循環(huán),而且鏈表不會倒置
往 期 推 薦 1、阿里云盤正式公測!免費領(lǐng)1年云盤擴(kuò)容碼,速來,先到先得! 2、牛逼!IntelliJ IDEA居然支持視頻聊天了~速來嘗鮮!快來沖一波 3、微信這些表情包,我可能再也不敢用了!你還用嗎? 4、知名國產(chǎn)網(wǎng)盤翻車?清空免費用戶文件后,又開始清理付費用戶資源 5、Chrome新功能曝光:你訪問的敏感網(wǎng)站可以自動隱藏起來 6、萬萬沒想到,“紅孩兒”竟然做了程序員,還是CTO! 7、徒手?jǐn)]一個Spring Boot中的starter,解密自動化配置,超級棒!

點分享

點收藏

點點贊

點在看


