public class circlemap
//該方法僅用於新增乙個key-value隊
void
addentry(int hash, k key, v value, int bucketindex) {
// 獲取指定
bucketindex
索引處的
entry
entrye = table[bucketindex];
// 將新建立的
entry
放入bucketindex
索引處,並讓新的
entry
指向原來的
entry
table[bucketindex] = new entry(hash, key, value, e); //引數e, 是entry.next
//如果size超過threshold,則擴充table大小
為原來的2倍
。再雜湊
if (size++ >= threshold)
resize(2 * table.length);
當然hashmap
裡面也包含一些優化方面的實現,這裡也說一下。比如:
entry
的長度一定後,隨著
map裡面資料的越來越長,這樣同乙個
index
的鏈就會很長,會不會影響效能?
hashmap
裡面設定乙個因子,隨著
map的
size
越來越大,
entry
會以一定的規則加長長度。 根據上面 put
方法的源**可以看出,當程式試圖將乙個
key-value
對放入
hashmap
中時,程式首先根據該
key
的 hashcode()
返回值決定該
entry
的儲存位置:如果兩個
entry
的 key
的 hashcode()
返回值相同,那它們的儲存位置相同。如果這兩個 entry
的 key
通過 equals
比較返回
true
,新新增
entry
的 value
將覆蓋集合中原有
entry
的 value
,但 key
不會覆蓋。如果這兩個
entry
的 key
通過 equals
比較返回
false
,新新增的
entry
將與集合中原有
entry
形成 entry
鏈,而且新新增的
entry
位於 entry
鏈的頭部。當向 hashmap
中新增
key-value
對,由其
key
的 hashcode()
返回值決定該
key-value
對(就是
entry
物件)的儲存位置。當兩個
entry
物件的
key
的 hashcode()
返回值相同時,將由
key
通過 eqauls()
比較值決定是採用覆蓋行為(返回
true
),還是產生
entry
鏈(返回
false
)。public v get(object key) {
// 如果 key 是 null,呼叫 getfornullkey 取出對應的 value
if (key == null)
return getfornullkey();
// 根據該 key 的 hashcode 值計算它的 hash 碼
int hash = hash(key.hashcode());
//先定位到陣列元素,再遍歷該元素處的鍊錶
// 直接取出 table 陣列中指定索引處的值
for (entrye = table[indexfor(hash, table.length)];
e != null;
e = e.next) {
object k;
// 如果該 entry 的 key 與被搜尋 key 相同
if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
return e.value;
return
null;
null key總是存放在
entry
陣列的第乙個元素。
private v putfornullkey(v value) {
for (entrye = table
[0]; e != null; e = e.next) {
if (e.key == null) {
v oldvalue = e.value;
e.value = value;
e.recordaccess(this);
return oldvalue;
modcount++;
addentry(0, null, value, 0);
return
null;
private v getfornullkey() {
for (entrye = table[0]; e != null; e = e.next) {
if (e.key == null)
return e.value;
return
null;
hashmap訪問時,都需要計算當前
key應該對應
entry
陣列哪個元素,即計算陣列下標;演算法如下: //
returns index for hash code h.
static
intindexfor(int h, int length) {
return h & (length-1);
按位取並,作用上相當於取模mod
或者取餘%。
這意味著陣列下標相同,並不表示hashcode
相同。1.
開放定址法(線性探測再雜湊,二次探測再雜湊,偽隨機探測再雜湊)
2. 再雜湊法
3. 鏈位址法
4. 建立乙個公共溢位區
HashMap的遍歷方法
hashmap內部維護的是乙個內部元素為entry的陣列,entry內部儲存的才是真正的鍵值 值對,所以在遍歷的時候,首先取出陣列中的元素即entry,然後再獲取鍵值或者是值。1 不用迭代器 放入元素 maps.put wang 1 maps.put li 2 maps.put jiang 3 遍歷...
使用多種方式實現遍歷HashMap的方法
今天講解的主要是使用多種方式來實現遍歷hashmap取出key和value,首先在j a中如果想讓乙個集合能夠用for增強來實現迭代,那麼此介面或類必須實現iterable介面,那麼iterable究竟是如何來實現迭代的,在這裡將不做講解,下面主要講解一下遍歷過程。定義乙個泛型集合 map map ...
HashMap的幾種遍歷方法
目錄 一 通過keyset 方法遍歷 二 通過entryset 方法遍歷 三 通過lambda表示式遍歷 四 通過streams遍歷 先通過map.keyset 獲取所有鍵,然後遍歷所有鍵獲取對應值,具體 如下 public class test 1.2 iterator遍歷 system.out....