1. 程式人生 > >集合類--最詳細的面試寶典--看這篇就夠用了(java 1.8)

集合類--最詳細的面試寶典--看這篇就夠用了(java 1.8)

函數 -- 面試 問題 計算方法 數組長度 操作 寶典 內部實現

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)