面試題:請說一下HashMap的底層實現原理。

  • HashMap使用數組加鏈表實現。每個數組中儲存着鏈表。

  • 當使用put方法儲存key-value鍵值對時,會先調用key的hashCode方法,得到此key經特定哈希運算後的值,然後將此值通過其他運算(?)得到一個值,將這個值與(length-1)做或操作(&),相當於對數組長度做取餘操作。最終得到一個值作爲此key在數組中的索引值,然後將key-value鍵值對儲存進去。通過這種方法將儲存的不同key-value鍵值對“散列”到數組的不同位置。

    在儲存的時候,如果索引位置尚無元素,那麼直接儲存。如果有元素,那麼就調用此key的equals方法與原有的元素的Key進行比較。如果返回true,說明在這個equals定義的規則上,這兩個Key相同,那麼將原有的key保留,用新的value代替原來的value。如果返回false,那麼就說明這兩個key在equals定義的規則下是不同元素,那麼就與此鏈表的下一個結點進行比較,知道最後一個結點都沒有相同元素,再下一個是null的時候,就用頭插法將此key-value添加到鏈表上。

    HashMap對重複元素的處理方法是:key不變,value覆蓋。

  • 當使用get方法獲取key對應的value時,會和儲存key-value時用同樣的方法,得到key在數組中的索引值,如果此索引值上沒有元素,就返回null。如果此索引值上有元素,那麼就拿此key的equals方法與此位置元素上的key進行比較,如果返回true。就返回此位置元素對應的value。如果返回false,就一直按鏈表往下比較,如果都是返回false,那麼就返回null。

另外:HashMap在JDK1.8之後引入紅黑樹結構。HashMap是線程不安全的,線程安全的是CurrentHashMap,不過此集合在多線程下效率低。

 

本人手寫HashMap,實現部分方法:https://github.com/hanhanhanxu/MyHashMap

 

關於更多Hash算法,HashMap擴容機制等請移步我的個人博客網站:http://hanhanhanxu.coding.me/2019/06/10/Hash/#more

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章