下面以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中並沒有它的...