集合類--最詳細的面試寶典--看這篇就夠用了(java 1.8)
阿新 • • 發佈:2019-03-01
函數 -- 面試 問題 計算方法 數組長度 操作 寶典 內部實現
https://www.cnblogs.com/yysbolg/p/9230184.html
為什麽hashset不安全,因為內部實現用到了hashmap
hashmap的put方法不安全,resize方法不安全,同是resize()方法時,如果調用get,可能會產生環形的鏈表
為什麽一定要是2的位數??
為了能讓 HashMap 存取高效,盡量較少碰撞,也就是要盡量把數據分配均勻。我們上面也講到了過了,Hash 值的範圍值-2147483648到2147483647,前後加起來大概40億的映射空間,只要哈希函數映射得比較均勻松散,一般應用是很難出現碰撞的。但問題是一個40億長度的數組,內存是放不下的。所以這個散列值是不能直接拿來用的。用之前還要先做對數組的長度取模運算,得到的余數才能用來要存放的位置也就是對應的數組下標。這個數組下標的計算方法是“ (n - 1) & hash ”。(n代表數組長度)。這也就解釋了 HashMap 的長度為什麽是2的冪次方。
這個算法應該如何設計呢?
我們首先可能會想到采用%取余的操作來實現。但是,重點來了:“取余(%)操作中如果除數是2的冪次則等價於與其除數減一的與(&)操作(也就是說 hash%length==hash&(length-1)的前提是 length 是2的 n 次方;)。” 並且 采用二進制位操作 &,相對於%能夠提高運算效率,這就解釋了 HashMap 的長度為什麽是2的冪次方
集合類--最詳細的面試寶典--看這篇就夠用了(java 1.8)