HashMap 原始碼分析

2021-08-18 02:31:06 字數 1016 閱讀 8509

(1)getentry(object key) 方法:

final entrygetentry(object key) 

return

null;

}

根據key的hash值計算出索引,得到table中的位置,然後遍歷table處的鍊錶

for(entrye = table[indexfor(hash, table.length)]; e!=null; e=e.next())
對比e的hash,並且判斷k是否相等(== || equals)

這是因為即使具有相同的hash值,也不能代表兩個完全相等

需要採用equals進行判斷

(2)put(k key, v value) 方法

public v put(k key, v value) 

}modcount++;

addentry(hash, key, value, i);

return

null;

}

步驟:

hash(key.hashcode())->table[indexfor(hash, table.length)]->loop the linkedlist

->(has the key)cover the value

->(not foud key)addentry

(3)addentry

(4)hash()方法

static

int hash(int h)

通過key的hashcode()方法得值再加hash計算得出

(5)map中比較類的equals和hashcode關係

重寫equals方法,一定要重寫hashcode,要確保如果equals相等,hashcode要一致,因為關係到indexfor在table下的陣列位置

但是如果equals不相等,hashcode也可能相等,這就是會造成衝突

HashMap原始碼分析

public hashmap int initialcapacity,float loadfactor 2 接下來是重要的put方法,put方法用於將鍵值對儲存到map中,讓我們來具體分析一下。public v put k key,v value if key null 若key為null,則將va...

HashMap原始碼分析

public v put k key,v value if key null return putfornullkey value int hash hash key int i indexfor hash,table.length for entrye table i e null e e.nex...

HashMap原始碼分析

size記錄了所有鍵值對的數目,包括陣列 內部實現 中的和陣列某些位置附屬鍊錶 hash值相同,不允許覆蓋已存在的鍵值對,所以要以鍊錶形式附加 中的鍵值對。hashmap的內部實現是陣列 鍊錶,通過鍵的hash值來定位鍵值對在陣列中的位置,是一種離散結構,所以陣列的某些索引上沒有儲存元素。1.預設引...