(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.預設引...