我一直有個疑問,爲何hashmap可以實現O(1)的查找複雜度。。縱使其存儲了一些鍵值對<key,value>,那也只能保證你找到了key值以後,可以在O(1)事件內查詢到value值。。而個人疑問是,怎麼保證key值的查找也在O(1)事件內完成。而這也是整個hashmap中最關鍵的問題。java
1、理解:
經過閱讀jdk的源碼,我對該問題的理解以下:
咱們知道hashmap在存儲鍵值對時藉助了「數組+鏈表」的方式。算法
咱們對一個鍵值對的查詢,是分爲四步的。數組
先根據key值計算出hash值以及h值(h值是java實現中處理獲得的更優的index索引值)
查找table數組中的h位置,獲得相應的鍵值對鏈表
根據key值,遍歷鍵值對鏈表,找到相應的鍵值對,
從鍵值對中取出value值。性能
只有以上四步都能在O(1)時間內完成,hashmap才能擁有O(1)的時間複雜度。易知,步驟1(計算)、步驟2(數組的查找)和步驟4(從鍵值對中取value值)均可以在O(1)時間內完成。那麼,步驟3中鏈表的長度決定了整個hashmap容器的查找效率,這也是hashmap容器設計的關鍵。必須採用優秀的hash算法以減小「衝突」,使得鏈表的長度儘量短,理想狀態下鏈表長度都爲1。設計
2、結論:對象
hashmap容器O(1)的查找時間複雜度只是其理想的狀態,而這種理想狀態須要由java設計者去保證
在由設計者保證了鏈表長度儘量短的前提下,因爲利用了數組結構,使得key的查找在O(1)時間內完成
能夠將hashmap分紅兩部分來看待,hash和map。map只是實現了鍵值對的存儲,也就是以上查詢步驟的第4步。而其整個O(1)的查找複雜度很大程度上是由hash來保證的。
hashmap對hash的使用體現出一些設計哲學,如:經過key.hashCode()將普通的object對象轉換爲int值,從而能夠將其視爲數組下標,利用數組O(1)的查找性能。
blog