今天花了一天的時間敲代碼查資料查閱了java 7 的HashMap的工做原理,java 8 的hashMap 代碼更爲複雜,一下是java 7的原理:java
put 方法數組
一、首先對key 值進行null 驗證,若是爲null,則把元素存儲到Entry<k,v>數組的一個元素中,返回null,由於null 的哈希值是0.spa
二、而後調用hash 方法計算hash 值 會調用對象的hashCode 方法對象
三、調用indexFor 根據hash 值獲取table 準確的位置get
四、遍歷準確找到數組中的鏈表。比較hashCode 和 equals 方法檢查有無碰撞,若是添加的元素與已經存在元素的 hashCode 相同而且equals 相同的話,則 把以前的value 覆蓋成新加入的value return
hash
五、添加元素,若是當前數組大小大於 16*0.75 的大小 hashMap 將會建立如今的數組長度*2 的數組it
六、若是添加的元素和以前元素的hashCode 相同,equels不一樣,則數組的下標相同,會new 一個Entry對象 把 原有的對象放入 鏈表中。table
七、若是添加的元素和值以前的元素 hashCode 、equles 不相同的話,那麼則會添加到table的下一個位置當中去。原理
get 方法遍歷
一、首先對key 值進行null 驗證,若是爲null,返回table[0]中的元素 null
二、而後調用hash 方法計算hash 值 會調用對象的hashCode 方法
三、調用indexFor 計算 table 準確的位置
四、遍歷數組的鏈表 :根據hashCode 和equals 判斷 此元素是否相等。