作者:廢物大師兄 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值,進而計算得到應(yīng)該放置到數(shù)組的位置 3、如果該位置為空,則直接放置此處 4、如果該位置不為空,而且元素是紅黑樹,則插入到其中 5、如果是鏈表,則遍歷鏈表,如果找到相等的元素則替換,否則插入到鏈表尾部 6、如果鏈表的長度大于或等于8,則將鏈表轉(zhuǎn)成紅黑樹 1、計算hash求位置 2、看第一個元素是不是要找的,是則返回,否則遍歷 擴容就是將舊數(shù)組的元素移動到新數(shù)組。 總結(jié): 1、HashMap底層是用數(shù)組+雙向鏈表+紅黑樹實現(xiàn)的 2、插入元素的時候,首先通過一個hash方法計算得到key的哈希值,進而計算出待插入的位置 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、擴容的時候,1.8中不會出現(xiàn)死循環(huán),而1.7中容易出現(xiàn)死循環(huán),而且鏈表不會倒置 1.600+ 道 Java面試題及答案整理(2021最新版) 2.終于靠開源項目弄到 IntelliJ IDEA 激活碼了,真香! 3.阿里 Mock 工具正式開源,干掉市面上所有 Mock 工具! 4.Spring Cloud 2020.0.0 正式發(fā)布,全新顛覆性版本! 5.《Java開發(fā)手冊(嵩山版)》最新發(fā)布,速速下載! 覺得不錯,別忘了隨手點贊+轉(zhuǎn)發(fā)哦! |
|