HashMap在日常開發中常用,每次我都只是會使用,沒有騰出時間去研究其中得原理,閑暇時間去刨析一下,其get、put方法,做下筆記方便以后復習。
hashmap是怎么來的?首先要知道數組結構,與鏈表結構。
數組結構
我們日常使用得數組結構特點,空間復雜度高,區間連續,時間復雜O(1)
優點:查詢快,原因是因為他通過數組得下標去查詢,區間連續,隨機查詢效率高。
缺點:存儲較慢,原因是 區間連續,我們存儲到某個下標位置得時候,其后邊所有得下標都需要后移,效率較低。
鏈表結構
特點,空間復雜度低,區間離散,時間復雜度O(N)
優點:存儲較快,沒有固定大小,內存利用率高。
缺點:查詢較慢,原因是每次查詢都需要從最開始開始遍歷,不能隨機查找,效率低。
所以hashmap是集中了數組結構與鏈表結構得優點,實現查詢快,存儲快。
put:
是我們插入是后調用得方法,當我們調用.put(k,v)得時候,首先會把k,v封裝到一個node節點中,然后調用k得hashCode方法得到hash值,通過hash函數,將hash值轉換為數組下標,如果此下標對應得位置上沒有元素,則將節點存到該位置,如果有鏈表,則會拿k去與鏈表上得每個節點得k去做比較,相同得話就覆蓋此鏈表上得節點,全部不同得話就會,在此鏈表尾部,新建一個新的節點(k,v得node節點)。這樣就完成了一次插入。
get:
我們查詢的時候調用得方法,首先會調用k得hashcode方法,得到hash值,然后通過hash函數將hash值轉換為數組下標,去該下標中看有沒有元素,沒有得話返回null,如果該下標對應得位置有單鏈表,則會去鏈表拿k去和單鏈表得每個節點得k做對比,如果有相同得則返回,該節點得值,如果全部比完后沒有相同得則返回null,此為一次查詢。