HashMap為什么要使用數組加鏈表


問題的源頭:HashMap數據結構是?

  數組加鏈表,1.8增加了紅黑樹,那么為什么使用數組加鏈表?如果簡單回答:“數組的特點查找快,增刪慢,鏈表查找慢,增刪快,數組加鏈表是結合兩者優點”,其實這種描述並不對。在使用HashMap的時候數組插入並不慢,而鏈表增刪快的特點也沒有發揮出來,因為每次put都需要遍歷一遍判斷key值是否相等,那么使用鏈表的原因其實是不得已而為之。那么設計者最初可能只想使用數組,但是單單使用數組的時候一旦發生hash沖突,那么就需要進行數組的擴容,這樣經常擴容的開銷是很大的。所以使用了鏈表來緩解哈希沖突對擴容的需求,減少擴容次數

tips:哈希表在理論(無哈希沖突時)的增刪改查時間復雜度都是O(1)。

tips:開放地址法,標題:《哈希表之開放地址的三種方法》 作者:Richard-Cai 參考文章:https://blog.csdn.net/cai2016/article/details/52728761

  至於為什么使用紅黑樹?由上面可知,鏈表長度是影響HashMap效率的關鍵,當鏈表長度過長時,改為紅黑樹提高查找效率O(logn)>O(n),但是紅黑樹結點比鏈表要多了一倍,屬於空間換時間的一種或方法。

  為什么不使用其他樹?相對AVL樹,AVL平衡性要求高(高度差不超過1),增刪結點時旋轉次數多,紅黑樹平衡性要求低(高度差一半),紅黑樹的插入更快,旋轉次數更少。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM