HashMap遍歷方法和實現原理分析

2021-07-07 05:20:03 字數 3294 閱讀 6095

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