一:List
二:Queue
三:Set
基于相應(yīng)的Map實(shí)現(xiàn) Set<E> = Map<E,Object>, final Object PRESENT = new Object();
四:Map
HashMap:它根據(jù)鍵的hashCode值存儲(chǔ)數(shù)據(jù)彻秆,大多數(shù)情況下可以直接定位到它的值裸扶,因而具有很快的訪問速度瞬逊,但遍歷順序卻是不確定的。 HashMap最多只允許一條記錄的鍵為null垮庐,允許多條記錄的值為null。HashMap非線程安全哄酝,即任一時(shí)刻可以有多個(gè)線程同時(shí)寫HashMap麦向,可能會(huì)導(dǎo)致數(shù)據(jù)的不一致。如果需要滿足線程安全浴韭,可以用 Collections的synchronizedMap方法使HashMap具有線程安全的能力丘喻,或者使用ConcurrentHashMap。
Java HashMap源碼學(xué)習(xí)Hashtable:Hashtable是遺留類念颈,很多映射的常用功能與HashMap類似泉粉,不同的是它承自Dictionary類,并且是線程安全的,任一時(shí)間只有一個(gè)線程能寫Hashtable嗡靡,并發(fā)性不如ConcurrentHashMap跺撼,因?yàn)镃oncurrentHashMap引入了分段鎖。Hashtable不建議在新代碼中使用讨彼,不需要線程安全的場(chǎng)合可以用HashMap替換财边,需要線程安全的場(chǎng)合可以用ConcurrentHashMap替換。
-
LinkedHashMap:LinkedHashMap是HashMap的一個(gè)子類点骑,保存了記錄的插入順序酣难,在用Iterator遍歷LinkedHashMap時(shí),先得到的記錄肯定是先插入的黑滴,也可以在構(gòu)造時(shí)帶參數(shù)憨募,按照訪問次序排序。
默認(rèn)構(gòu)造函數(shù)是只記錄插入順序LinkedHashMap<String, Integer> map = new LinkedHashMap<>(); map.put("one", 1); map.put("two", 2); map.put("three", 3); map.put("two", 3); //[one=1, two=3, three=3] 記錄訪問順序袁辈,每次訪問node都會(huì)將其添加到鏈表的尾部菜谣; 遍歷時(shí)從頭部開始遍歷; LinkedHashMap<String, Integer> map = new LinkedHashMap<>(16, (float) 0.75, true); map.put("one", 1); map.put("two", 2); map.put("three", 3); map.get("two"); // [one=1, three=3, two=2]
TreeMap:TreeMap實(shí)現(xiàn)SortedMap接口晚缩,能夠把它保存的記錄根據(jù)鍵排序尾膊,默認(rèn)是按鍵值的升序排序,也可以指定排序的比較器荞彼,當(dāng)用Iterator遍歷TreeMap時(shí)冈敛,得到的記錄是排過序的。如果使用排序的映射鸣皂,建議使用TreeMap抓谴。在使用TreeMap時(shí),key必須實(shí)現(xiàn)Comparable接口或者在構(gòu)造TreeMap傳入自定義的Comparator寞缝,否則會(huì)在運(yùn)行時(shí)拋出java.lang.ClassCastException類型的異常癌压。
-
ConcurrentHashMap
-
JDK1.7
Segment + HashEntry;每個(gè)Segment繼承了ReentrantLock荆陆,自帶鎖功能滩届;
size實(shí)現(xiàn):因?yàn)镃oncurrentHashMap是可以并發(fā)插入數(shù)據(jù)的,所以在準(zhǔn)確計(jì)算元素時(shí)存在一定的難度被啼,一般的思路是統(tǒng)計(jì)每個(gè)Segment對(duì)象中的元素個(gè)數(shù)帜消,然后進(jìn)行累加,但是這種方式計(jì)算出來的結(jié)果并不一樣的準(zhǔn)確的趟据,因?yàn)樵谟?jì)算后面幾個(gè)Segment的元素個(gè)數(shù)時(shí)券犁,已經(jīng)計(jì)算過的Segment同時(shí)可能有數(shù)據(jù)的插入或則刪除术健。
-
JDK1.8
1.8中放棄了Segment臃腫的設(shè)計(jì)汹碱,取而代之的是采用Node + CAS + Synchronized來保證并發(fā)安全進(jìn)行實(shí)現(xiàn); 每個(gè)Node結(jié)點(diǎn)為空時(shí)CAS式添加荞估,鏈表/紅黑樹添加節(jié)點(diǎn)需要Synchronized內(nèi)置鎖咳促;
size實(shí)現(xiàn):1.8中使用一個(gè)volatile類型的變量baseCount記錄元素的個(gè)數(shù)稚新,當(dāng)插入新數(shù)據(jù)或則刪除數(shù)據(jù)時(shí),會(huì)通過addCount()方法更新baseCount跪腹;
-
@夢(mèng)工廠2018.3.26