HashMap原理及put與get方法呼叫過程
阿新 • • 發佈:2019-01-10
HashMap的原理
HashMap的資料結構為陣列+連結串列,以key,value的形式存值,通過呼叫put與get方法來存值與取值。
它內部維護了一個Entry陣列,得到key的hashCode值將其移位按位與運算,然後再通過跟陣列的長度-1作邏輯與運算得到一個index值來確定資料儲存在Entry陣列當中的位置,通過連結串列來解決hash衝突問題。當發生碰撞了,物件將會儲存在連結串列的下一個節點中。
get方法呼叫
1.當呼叫get方法時會呼叫hash函式,這個hash函式會將key的hashCode值返回,返回的hashCode與Entry陣列長度-1進行邏輯與運算得到一個index值,用這個index值來確定資料儲存在Entry陣列當中的位置
2.通過迴圈來遍歷索引位置對應的連結串列,初始值為資料儲存在Entry陣列當中的位置,迴圈條件為Entry物件不為null,改變迴圈條件為Entry物件的下一個節點
3.如果hash函式得到的hash值與Entry物件當中key的hash值相等,並且Entry物件當中的key值與get方法傳進來的key值equals相同則返回該Entry物件的value值,否則返回null
put方法呼叫
1.呼叫hash函式得到key的HashCode值
2.通過HashCode值與陣列長度-1邏輯與運算得到一個index值
3.遍歷索引位置對應的連結串列,如果Entry物件的hash值與hash函式得到的hash值相等,並且該Entry物件的key值與put方法傳過來的key值相等則,將該Entry物件的value值賦給一個變數,將該Entry物件的value值重新設定為put方法傳過來的value值。將舊的value返回。
4.新增Entry物件到相應的索引位置
以上都為我個人理解,如有不正確希望大家指出,共同討論。