【Java】HashMap的数据结构、源码解析 - 公开课笔记
主要內容
- Hashmap的數據結構
- HashMap實現原理
- HashMap源碼解析
HashMap底層的數據結構?
1.7之前:數組+鏈表
1.8之后:數組+鏈表+紅黑樹
bucket
1.7之前:
每一個節點的數據結構:
1.8之后加入了紅黑樹
1、紅黑樹是一顆平衡二叉樹,保證左子樹和右子樹的層數差不多。最長路徑不能超過最短子樹的2倍。
2、“紅黑樹是不太嚴格的平衡樹,而AVL是嚴格的平衡樹”
3、每一條搜索路徑必須包含相同個數的黑色節點
4、
為什么使用紅黑樹?因為鏈表在進行元素搜索的時候,時間復雜度O(n),而紅黑樹時間復雜度O(logn)
樹化、退化的過程,是由參數配置的。
HashMap大小初始化是16,為什么是16(2的n次冪)?
方便擴容之后元素的移動,方便&運算
算法導論:
在基本的幾個構造方法時,new的時候只是設了一個loadFactor,沒有真正的創建數組
幾個重要的參數
初始化容量
最大容量
負載因子:每次到0.75倍容量的時候就擴容。選0.75是因經過大量統計計算得出的結論,是經過測試的,空間與時間的平衡
為什么是加載因子是0.75,在一個標準的正態分布,λ=0.5的時候,hash碰撞為0的概率為0.60653066,所以加載因子折中為0.75,而hash碰撞為8的概率為小數位后7個0,幾乎是不可能發生的事情,所以在達到8后才轉為紅黑樹
類似的,hadoop有一個100M內存空間的buffer
樹化:8
反樹化:6
跟源碼
put操作
擾動函數:讓散列更均勻(此處的哈希算法是讓高位和低位進行異或操作)
resize方法:(如果未創建)初始化容量為16的數組,或(如果已創建數組)2倍擴容
與運算比取模運算效率更高,容量是2的n次冪的時候,可以用與運算代替取模運算
總結
以上是生活随笔為你收集整理的【Java】HashMap的数据结构、源码解析 - 公开课笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Redis使用场景、Redis线程模型、
- 下一篇: Java程序员需要掌握的计算机底层知识(