昨天專案發布間隙,看了下hashmap的演算法。關鍵在於:
static int hash(int h)
和 static int indexfor(int h, int length)
這2個方法。
注意,這2個方法一定要配合使用,否則就比較難理解了。
這裡我解答幾個問題,
1. hash方法裡傳入的是物件的hashcode,而物件的hashcode是物件的記憶體位址,已經保證了唯一性,為什麼還要再進行hash計算?
回答:由於hash表的大小有限,不可能無限大,以hashmap實現中的indexfor方法來講,是以與操作來計算的。那麼假如hashcode轉換成二進位制以後,末尾相同的話,
那麼計算出來的index也就一樣了,造成雜湊度不夠。
2. indexfor方法為什麼針對length-1做與操作?
回答:與操作將會把超出陣列長度的部分截斷,另外map初始化的時候會做如下操作:
while (capacity < initialcapacity)
capacity <<= 1;
這樣,length肯定為2的n次方,好處是length-1轉換成2進製每一位都是1,在做&操作的時候每乙個坑都有機會得到值,否則假如有1位為0的情況,那一位就會浪費。
3.我這裡對hash函式有個疑問,這個演算法的目的是把原始資料分成3斷進行異或操作達到雜湊,但是我感覺最後結果的前4位是不會發生變。假如有資料前4位不一樣,剛好hash表的長度是後面的28位,那麼這個時候就會出現hash衝突了。不知道我這個理解對不對,請大家指正,謝謝。
hashmap的雜湊演算法
static final int hash object key int h return key null 0 h key.hashcode h 16 三元運算子 條件表示式?表示式1 表示式2 按位異或運算,只要位不同結果為1,不然結果為0 右移 右邊的位被擠掉,右移一位其值相當於除以2。如圖,...
HashMap的實現原理
一。hashmap的資料結構 資料結構中有陣列和鍊錶來實現對資料的儲存,但這兩者基本上是兩個極端。陣列 陣列儲存區間是連續的,占用記憶體嚴重,故空間複雜的很大。但陣列的二分查詢時間複雜度小,為o 1 陣列的特點是 定址容易,插入和刪除困難 鍊錶 鍊錶儲存區間離散,占用記憶體比較寬鬆,故空間複雜度很小...
實現HashMap的排序
已知乙個hashmap集合,user有name string 和 age int 屬性,請寫乙個方法實現對hashmap的排序功能,該方法接受hashmap為形參,返回型別為hashmap,要求對hashmap中的user的age倒序進行排序,排序時key value鍵值對不能拆散。注意 hashm...