HashMap集合中每個鍵值對也叫Entry融涣,這些Entry分散的存儲在一個數(shù)組中,這個數(shù)組是HashMap的主干精钮,數(shù)組中每個元素初始值為null威鹿,HashMap的默認長度為16,或者手動設(shè)置為2的n次方(之所以是2^n杂拨,是為了配合從key映射到index的hash算法专普,使插入的數(shù)據(jù)能均勻分布在數(shù)組中悯衬,避免有些index結(jié)果的出現(xiàn)幾率會更大弹沽,而有些index可能永遠不會出現(xiàn));
HashMap是怎么進行數(shù)據(jù)存取的筋粗;即HashMap常用的get和put方法原理策橘;
put原理:如hashMap.put("apple", 0);在插入一個鍵為apple的時候娜亿,
通過HashCode(key)&(length-1)算法公式來判斷這個Entry該插入數(shù)組中的哪個位置(index)丽已;
------HashCode(key)返回一個十進制的數(shù)值,轉(zhuǎn)化為二進制后和HashMap長度進行與運算买决;
可以說沛婴,Hash算法最終得到的index結(jié)果,完全取決于key的HashCode值的最后幾位督赤;
由于哈希函數(shù)算法不可避免會計算出index相沖突的情況嘁灯,解決這個問題:
--------HashMap數(shù)組的每一個元素不止是一個Entry對象,也是一個鏈表的頭節(jié)點躲舌。每一個Entry對象通過Next指針指向它的下一個Entry節(jié)點丑婿。當(dāng)新來的Entry映射到?jīng)_突的數(shù)組位置時,只需要插入到對應(yīng)的鏈表即可(jdk1.8之前是用“頭插法”);
get原理:
首先會把輸入的Key做一次Hash映射羹奉,得到對應(yīng)的index:index =? Hash(“apple”)
對于出現(xiàn)index沖突的位置秒旋,可能會匹配多個Entry,此時就需要順著對應(yīng)的鏈表的頭結(jié)點往下一個個查找诀拭;
在JDK1.8中對HashMap進行了改進(存儲結(jié)構(gòu):數(shù)組+鏈表+紅黑樹(JDK1.8增加了紅黑樹部分)實現(xiàn)的)
以上內(nèi)容是對來自微信公眾號:算法愛好者 中一篇文章的總結(jié)迁筛;
圖片來源于ImportNew中“Java8系列之重新認識HashMap”