HashMap源碼分析
public class HashMap<K,V> extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable
HashMap繼承自抽象類AbstractMap牢贸,Map中一些操作在AbstractMap中提供了默認(rèn)實(shí)現(xiàn)。AbstractMap的簽名如下:
public abstract class AbstractMap<K,V> implements Map<K,V>
抽象類AbstractMap實(shí)現(xiàn)了Map接口土辩,有意思的是HashMap繼承了AbstractMap類并實(shí)現(xiàn)了Map接口。在語法層面上實(shí)現(xiàn)Map接口是多余的抢野,這樣做僅僅是為了讓閱讀源碼的人明確知道HashMap是屬于Map體系的脯燃,只是起到文檔的作用。
實(shí)現(xiàn)接口Cloneable蒙保,表示可以拷貝。在HashMap中實(shí)現(xiàn)的是淺拷貝欲主,即對(duì)原對(duì)象的改變會(huì)影響到拷貝對(duì)象的狀態(tài)邓厕。
實(shí)現(xiàn)接口Serializable,用于標(biāo)明HashMap對(duì)象可以被序列化扁瓢∠昴眨可以將HashMap對(duì)象保存到本地,之后可以恢復(fù)狀態(tài)引几。
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; //默認(rèn)初始容量為16
默認(rèn)的初始容量為16昧互,必須為2的n次冪。
static final int MAXIMUM_CAPACITY = 1 << 30;//最大容量為2的30次方
最大容量為2的30次方
static final float DEFAULT_LOAD_FACTOR = 0.75f;//默認(rèn)加載因子
默認(rèn)加載因子為0.75f.
static final int TREEIFY_THRESHOLD = 8;//鏈表轉(zhuǎn)成紅黑樹的閾值
鏈表轉(zhuǎn)為紅黑樹的閾值.當(dāng)鏈表的長(zhǎng)度超過閾值8時(shí)伟桅,鏈表就會(huì)自動(dòng)轉(zhuǎn)成紅黑樹敞掘,這樣大大減少了查找的時(shí)間,由O(n)轉(zhuǎn)為O(logn)
static final int UNTREEIFY_THRESHOLD = 6;//紅黑樹轉(zhuǎn)成鏈表的閾值
紅黑樹轉(zhuǎn)為鏈表的閾值.
static final int MIN_TREEIFY_CAPACITY = 64;//存儲(chǔ)方式由鏈表轉(zhuǎn)為紅黑樹的最小閾值
//todo
transient int size;//HashMap中存儲(chǔ)的鍵值對(duì)的數(shù)量
size是HashMap中存儲(chǔ)的鍵值對(duì)的數(shù)量楣铁,HashMap實(shí)現(xiàn)了Serializable接口玖雁,意味著對(duì)象可以被序列化,將不需要序列化的屬性前加上transient關(guān)鍵字盖腕,在序列化對(duì)象的時(shí)候赫冬,該屬性就不會(huì)被序列化。
int threshold;//閾值
threshold是擴(kuò)容閾值溃列,當(dāng)HashMap中鍵值對(duì)的數(shù)量size>=threshold時(shí)劲厌,就會(huì)進(jìn)行擴(kuò)容。
final float loadFactor;//加載因子