static
class
entry
implements
map.entry
public
hashmap(int initialcapacity, float loadfactor)
final entrygetentry(object key)
//通過key的hashcode值計算hash值
int hash = (key == null) ? 0 : hash(key);
//indexfor (hash&length-1) 獲取最終陣列索引,然後遍歷鍊錶,通過equals方法比對找出對應記錄
for (entrye = table[indexfor(hash, table.length)];
e != null;
e = e.next)
return
null;
}
public v put(k key, v value) ,進行陣列填充(為table分配實際記憶體空間),入參為threshold,此時threshold為initialcapacity 預設是1<<4(24=16)
if (table == empty_table)
//如果key為null,儲存位置為table[0]或table[0]的衝突鏈上
if (key == null)
return putfornullkey(value);
int hash = hash(key);//對key的hashcode進一步計算,確保雜湊均勻
int i = indexfor(hash, table.length);//獲取在table中的實際位置
for (entrye = table[i]; e != null; e = e.next)
}modcount++;//保證併發訪問時,若hashmap內部結構發生變化,快速響應失敗
addentry(hash, key, value, i);//新增乙個entry
return
null;
}
void resize(int newcapacity)
entry newtable = new entry[newcapacity];
transfer(newtable, inithashseedasneeded(newcapacity));
//transfer方法逐個遍歷鍊錶,重新計算索引位置,將老陣列資料複製到新陣列中去
table = newtable;
threshold = (int)math.min(newcapacity * loadfactor, maximum_capacity + 1);
}
ha****erator()
}
final entrynextentry() {
if (modcount != expectedmodcount)
throw
new concurrentmodificationexception();
學習 HashMap 原理筆記
感謝 學習了,寫寫筆記。雜湊表。雜湊表利用陣列根據下標查詢元素,一次定位就可以找到,複雜度為o 1 可以理解,雜湊表的主幹是陣列,通過某個函式把當前元素的關鍵字對映到陣列中的某個位置上,通過下標就可以完成定位。雜湊衝突 插入的時候,用雜湊函式算出來的對映下標插入元素的時候,發現該位置已經被占用。ha...
學習筆記HashMap原始碼學習
hashmap hashmapextends abstractmap implements map,cloneable,serializable 繼承abstractmap類,實現頂層介面map介面 int default initial capacity 1 4 預設容量為16 int maxim...
HashMap原始碼學習筆記
hashmap的底層主要是基於陣列和鍊錶來實現的,它之所以有相當快的查詢速度主要是因為它是通過計算雜湊碼來決定儲存的位置。hashmap中主要是通過key的hashcode來計算hash值的,只要hashcode相同,計算出來的hash值就一樣。如果儲存的物件對多了,就有可能不同的物件所算出來的ha...