HashMap簡析

一、存儲結構

        HashMap存儲結構以下圖: spa

        上邊這個圖畫的有點小問題,其實table實際存放的只是Entry引用的列表而已,並非一個個Entry對象,相似C/C++裏的指針列表,後邊鏈表裏邊的纔是一個個Entry對象實體。 指針

二、知識要點

1)table(Entry[])的長度是2的冪次: 對象

        主要爲了index計算效率,由index = hash(key) & (table.length-1) 代替index = key.hash() % table.length 文檔

        (可能有其它的做用,暫時沒有想到或看到其它的文檔有說明) hash

2)爲何Java對象在修改equals()方法實現後,對應也須要修改hashCode()方法: table

        HashMap插入流程: 效率

        a. 經過key.hashCode()來定位key對應Entry所在的鏈表遍歷

        b. 經過equals()遍歷鏈表中指定key對應的Entry; 引用

        c. Entry爲空則插入新的key-value(Entry<keyType, valueType>); 方法

        若是對象equals()比較相同,可是由於key.hashCode()不一樣致使定位到不一樣的Entry鏈表,這時再經過equals()遍歷鏈表查找不到業務上相同的key的Entry,這時HashMap中就會插入業務上應該相等的兩個key。

相關文章
相關標籤/搜索