Java集合詳解四 HashMap原始碼詳解

2021-08-14 07:09:45 字數 1881 閱讀 5478

下面以jdk1.6中的hashmap講解其原始碼:

一、儲存原理

首先,hashmap中的key-value使用node來進行儲存,而node之間是怎麼進行連線的呢?使用陣列+鍊錶的形式進行儲存,即雜湊表:

雜湊錶即為頭部使用陣列進行儲存,頭部之後的資料使用鍊錶進行儲存。

二、原始碼解析:

1、儲存的節點原始碼:

hashmap中的key-value使用entry類來進行儲存,原始碼如下:

static class entryimplements map.entry

public final k getkey()

public final v getvalue()

// 設定value,返回舊的value

public final v setvalue(v newvalue)

public final boolean equals(object o)

return false;

}public final int hashcode()

public final string tostring()

… }

2、hashmap的重要引數與構造方法:

hashmap中的關鍵屬性:

// 儲存著鍊錶頭部的陣列

transient entry table;

// map的實際大小

transient int size;

// 臨界值,當實際大小超過臨界值時,會進行擴容 threshold = 載入因子 * 容量

int threshold;

// 載入因子

final float loadfactor;

// map被修改的次數

transient volatile int modcount;

// 有參構造方法:

// 其中 initialcapacity 為初始化的table的大小

// loadfactor為載入因子

public hashmap(int initialcapacity, float loadfactor)

// 預設的陣列大小

static final int default_initial_capacity = 16;

// 陣列最大的數量,2的30次方

static final int maximum_capacity = 1 << 30;

//預設的載入因子

static final float default_load_factor = 0.75f;

// 無參構造方法:

public hashmap()

put(key,value)方法:

put(key, value)方法:

public v put(k key, v value)

}// 走到這一步,那麼肯定原先table上的單鏈表沒有一樣的key,直接呼叫addentry新增即可

modcount++;

addentry(hash, key, value, i);

return null;

}

可以看到,hashmap會先得到key的hash值,然後根據hash值得到在自己的陣列中的位置,然後遍歷對應鍊錶,進行替換或新增

get(object key)方法:

public v get(object key) 

return null;

}

java集合詳解

1 vector arraylist都是以類似陣列的形式儲存在記憶體中,linkedlist則以鍊錶的形式進行儲存。2 list中的元素有序 允許有重複的元素,set中的元素無序 不允許有重複元素。3 vector執行緒同步,arraylist linkedlist執行緒不同步。4 linkedli...

Java 集合類詳解

上述類圖中,實線邊框的是實現類,比如arraylist,linkedlist,hashmap等,折線邊框的是抽象類,比如abstractcollection,abstractlist,abstractmap等,而點線邊框的是介面,比如collection,iterator,list等。發現乙個特點,...

Java集合類詳解

陣列 只能存放基本資料型別,長度固定,不適合在資料未定的情況下使用 集合 存放物件,長度可變,功能強大 jdk 中 主要的集合類分為兩種 collection 和 map 集合類框架圖如下 主要分為 collection和map兩大類 collection介面是集合類中的一種基類,jdk中並沒有它的...