//最大容量 2的30次方
static final int maximum_capacity = 1 << 30;
//預設的載入因子
static final float default_load_factor = 0.75f;
//雜湊桶,存放鍊錶。 長度是2的n次方,或者初始化時為0.
transient node table;
//載入因子,用於計算雜湊表元素數量的閾值。
final float loadfactor;
/* 雜湊表內元素數量的閾值,當雜湊表內元素數量超過閾值時,會發生擴容resize()。
* threshold = capacity * loadfactor;(容量*載入因子)
*/int threshold;
public hashmap()
public v put(k key, v value)
/** * onlyifabsent:如果是true,則不修改存在的值
*/final v putval(int hash, k key, v value, boolean onlyifabsent,boolean evict)
//如果中間存在相同的key,則結束迴圈
if (e.hash == hash &&
((k = e.key) == key || (key != null && key.equals(k))))
break;
p = e;}}
v oldvalue = e.value;
if (!onlyifabsent || oldvalue == null)
e.value = value;
//該方法是保留方法,功能是修改節點的順序,按照訪問的順序展示,linkedhashmap做了實現
afternodeaccess(e);
return oldvalue;}}
//更新此hashmap結構修改的次數
++modcount;
//更新元素元素個數並判斷是否需要擴容
if (++size > threshold)
resize();
//hashmap中沒有做實現,linkedhashmap中做了重寫
afternodeinsertion(evict);
return null;
}
final node resize()
//設定新的容量為舊容量的2倍
//同時如果新容量值小於最大預設容量且舊容量值大於等於預設的初始容量(16)
//則設定新的閾值為舊閾值的2倍
else if ((newcap = oldcap << 1) < maximum_capacity &&
oldcap >= default_initial_capacity)
newthr = oldthr << 1; // double threshold
}//如果當前容量為0當前閾值大於0,說明初始化指定了閾值,設定新閾值=舊閾值
else if (oldthr > 0) // initial capacity was placed in threshold
newcap = oldthr;
else
//如果新的閾值等於0
if (newthr == 0)
threshold = newthr;
@suppresswarnings()
//根據新的容量構建新的雜湊列表
node newtab = (node)new node[newcap];
table = newtab;
//如果舊的雜湊列表不為空
if (oldtab != null)
else
} while ((e = next) != null);
if (lotail != null)
if (hitail != null) }}
}}
return newtab;
}
public v remove(object key)
final noderemovenode(int hash, object key, object value,
boolean matchvalue, boolean movable)
p = e;
} while ((e = e.next) != null);}}
if (node != null && (!matchvalue || (v = node.value) == value ||
(value != null && value.equals(v))))
}return null;
}
hashmap原始碼學習
最近面試被問到了hashmap原始碼,所以再次認真學習整理一下 基於jdk1.7 hashmap主要由陣列和鍊錶組成,陣列是hashmap的主體,鍊錶是為了解決hash衝突而設計的。entry是hashmap的基本組成單元。每個entry包含一對key value的鍵值對。entry主要包括四個屬性...
HashMap原始碼學習
自己在學習的時候總感覺看懂了又沒有看懂,總有一層霧,所以乾脆寫個博文,看能不能徹底弄懂。測試用 hashmapmap new hashmap map.put 1 2 map.put 2 4 map.put 3 6 map.put 4 8 map.put 5 1 map.put 6 1 map.put...
HashMap原始碼學習筆記
hashmap的底層主要是基於陣列和鍊錶來實現的,它之所以有相當快的查詢速度主要是因為它是通過計算雜湊碼來決定儲存的位置。hashmap中主要是通過key的hashcode來計算hash值的,只要hashcode相同,計算出來的hash值就一樣。如果儲存的物件對多了,就有可能不同的物件所算出來的ha...