HashMap原始碼分析

2021-09-01 13:42:49 字數 2419 閱讀 2854

size記錄了所有鍵值對的數目,包括陣列(內部實現)中的和陣列某些位置附屬鍊錶(hash值相同,不允許覆蓋已存在的鍵值對,所以要以鍊錶形式附加)中的鍵值對。

hashmap的內部實現是陣列+鍊錶,通過鍵的hash值來定位鍵值對在陣列中的位置,是一種離散結構,所以陣列的某些索引上沒有儲存元素。

1. 預設引數:

// 預設初始容量 - 必須是2的乘方值

static final int default_initial_capacity = 16;

// 最大容量

static final int maximum_capacity = 1 << 30;

// 載入因子,在0~1之間取值,太小導致空間浪費;太大導致雜湊衝突頻繁。

static final float default_load_factor = 0.75f;

2. 讀取

// 返回和指定的鍵關聯的鍵值對

final entrygetentry(object key)

return null;

}

3. 新增

// 在此對映中關聯指定值與指定鍵。如果該對映以前包含了乙個該鍵的對映關係,則舊值被替換。

public v put(k key, v value)

}// 增加新的鍵值對,修改次數加1

modcount++;

addentry(hash, key, value, i);

return null;

}// key為null時優化

private v putfornullkey(v value)

}// 沒有找到則新增鍵值對,修改次數加1

modcount++;

addentry(0, null, value, 0);

return null;

}// 該方法取而代之put方法為構造器和偽構造器(轉殖,讀取物件)所呼叫。該方法不會增大table或者檢查更改等。它呼叫createentry而不是addentry方法。

private void putforcreate(k key, v value)

}createentry(hash, key, value, i);

}// 遍歷輸入map中的所有對映,依次呼叫putforcreate方法

private void putallforcreate(map<? extends k, ? extends v> m)

}// 將指定對映的所有對映關係複製到此對映中,這些對映關係將替換此對映目前針對指定對映中所有鍵的所有對映關係。

public void putall(map<? extends k, ? extends v> m)

for (iterator<? extends map.entry<? extends k, ? extends v>> i = m.entryset().iterator(); i.hasnext(); ) }}

// 用鍵、值、雜湊碼建立乙個新的對映到陣列指定的位置。根據需要來擴容。

void addentry(int hash, k key, v value, int bucketindex)

// 和addentry方法類似。主要用於轉殖、反序列化等偽構造操作中,不用考慮擴容問題。

void createentry(int hash, k key, v value, int bucketindex)

4. 擴容

// 重新計算該map元素的雜湊值並把元素存放到更大容量的陣列中。當鍵的數量達到閥值時該方法自動呼叫。

// 如果當前容量已經是最大值,該方法不會增大容量,而是將閥值設定為integer.max_value,這樣該方法就不會被後續呼叫。

void resize(int newcapacity)

entry newtable = new entry[newcapacity];

transfer(newtable); // 把當前陣列的對映轉移到新的陣列中

table = newtable;

threshold = (int)(newcapacity * loadfactor);

}// 把所有的對映從當前陣列轉移到新的陣列中

void transfer(entry newtable) while (e != null);}}

}

5. 刪除

// 清除所有的鍵值對,大小變為0

public void clear()

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 原始碼分析

1 getentry object key 方法 final entrygetentry object key return null 根據key的hash值計算出索引,得到table中的位置,然後遍歷table處的鍊錶 for entrye table indexfor hash,table.le...

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...