千鋒教育Java入門全套視頻教程(java核心技術(shù),適合java零基礎(chǔ),Java

HashMap
線程不安全的集合
數(shù)據(jù)結(jié)構(gòu):
JDK1.7:一維數(shù)組 + 單向鏈表,添加數(shù)據(jù)采用頭插法
JDK1.8:一維數(shù)組 + 單向鏈表or紅黑樹,添加數(shù)據(jù)采用尾插法
內(nèi)部屬性:
默認(rèn)初始化數(shù)組長度 - static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;
數(shù)組的最大長度 - static final int MAXIMUM_CAPACITY = 1 << 30;
默認(rèn)的負(fù)載因子 - static final float DEFAULT_LOAD_FACTOR = 0.75f;
結(jié)構(gòu)由鏈表轉(zhuǎn)為紅黑樹的鏈表長度閾值 - static final int TREEIFY_THRESHOLD = 8;
結(jié)構(gòu)由紅黑樹轉(zhuǎn)為鏈表的樹的節(jié)點(diǎn)個(gè)數(shù)閾值 - static final int UNTREEIFY_THRESHOLD = 6;
結(jié)構(gòu)由鏈表轉(zhuǎn)為紅黑樹的數(shù)組長度閾值 - static final int MIN_TREEIFY_CAPACITY = 64;
底層存儲(chǔ)數(shù)據(jù)的Node<K,V>數(shù)組,也叫hash表/hash數(shù)組 - transient Node<K,V>[] table;
一個(gè)Set集合,存放entry - transient Set<Map.Entry<K,V>> entrySet;
元素個(gè)數(shù)(鍵值對(duì)個(gè)數(shù))- transient int size;
外部操作數(shù) - transient int modCount;
擴(kuò)容閾值 - int threshold;
計(jì)算擴(kuò)容閾值的負(fù)載因子 - final float loadFactor;
構(gòu)造方法:
無參構(gòu)造:簡單初始化數(shù)據(jù),并將負(fù)載因子賦值為默認(rèn)負(fù)載因子
兩個(gè)參數(shù)的構(gòu)造器(int a, float b):判斷參數(shù)的合法性,a不能小于0,a不能大于數(shù)組的最大長度,b不能小于等于0,b不能是NaN(Not a Number 非數(shù)字),如果a是二的冪,則將數(shù)組長度賦值為a,否則就通過算法,將數(shù)組長度賦值為大于a并且最靠近a的2的冪
一個(gè)參數(shù)的構(gòu)造器(int a):直接調(diào)用兩個(gè)參數(shù)的構(gòu)造器,傳入 a 和默認(rèn)的負(fù)載因子
一個(gè)參數(shù)的構(gòu)造器(Map m):將負(fù)載因子賦值為默認(rèn)負(fù)載因子,將傳入的Map集合的映射關(guān)系取出并存入hash表中
擴(kuò)容機(jī)制:
當(dāng)數(shù)組中的元素個(gè)數(shù)(映射關(guān)系個(gè)數(shù))達(dá)到閾值的時(shí)候并且添加元素的數(shù)組的位置有元素時(shí),進(jìn)行擴(kuò)容,每次擴(kuò)容為原來的兩倍
JDK1.8特有:當(dāng)數(shù)組中存在長度大于8的鏈表,并且數(shù)組長度小于64的時(shí)候,會(huì)進(jìn)行擴(kuò)容,也是按兩倍擴(kuò)容
樹和鏈表的轉(zhuǎn)換閾值
鏈表 ---> 樹:數(shù)組長度大于64,數(shù)組中存在長度大于8的鏈表
樹 ---> 鏈表:數(shù)組中樹的節(jié)點(diǎn)數(shù)小于6