類繼承結構圖算法
HashMap
1. 對象的HashCode是用來在散列存儲結構中肯定對象的存儲地址的。數組
2. 若是兩個對象的HashCode相同,即在數組中的地址相同。而數組的元素是鏈表。這兩個對象會放在同一鏈表上。安全
3. 如何肯定是同一個對象? 經過equals方法。多線程
4. HashMap默認的加載因子是0.75,默認最大容量是16。擴容大小:擴容原來的一倍。併發
所以能夠得出HashMap的默認實際容量是:0.75*16=12,到了12就會擴容。高併發
5. JAVA 7中的HashMap是數組和鏈表的結合體。JAVA 8中是數組 + 紅黑樹實現。性能
ConcurrentHashMapspa
1. JDK1.7版本:ReentrantLock+Segment+HashEntry線程
JDK1.8版本中synchronized+CAS+HashEntry+紅黑樹,已經接近HashMap,相對而言,ConcurrentHashMap只是增長了同步的操做來控制併發。3d
2. 查詢時間複雜度:從原來的遍歷鏈表O(n),變成遍歷紅黑樹O(logN)。
3. 定位一個元素的過程須要進行兩次Hash操做。第一次Hash定位到Segment,第二次Hash定位到元素所在的鏈表的頭部。
TreeSet與TreeMap :能夠保證按大小排序。
LinkedHashSet與LinkedHashMap:加了一個雙向鏈表,能保證添加的順序。
ArrayList與LinkedList:即數組和鏈表的優缺點。查詢前者更高效,添加刪除後者更高效。
線程不安全的類
HashMap、HashSet、ArrayList、LinkedList、TreeSet、TreeMap
同步容器
ArrayList -> Vector、Stack
HashMap -> HashTable(key和value不能爲空)
- HashMap不是線程安全的,多線程環境容易致使CPU 100%
- HashTable使用synchronized來保證線程安全,效率低下。
Collections.synchronizedXXX(List,Set,Map):原理是直接使用synchronized修飾。通常併發夠用,可是高併發狀況下須要使用併發容器。
Collections.synchronizedList(l1);
Collections.synchronizedMap(new HashMap<String,String>());
Collections.synchronizedSet(new HashSet<String>());
Collections.synchronizedSortedMap(new TreeMap<String,String>());
Collections.synchronizedSortedSet(new TreeSet<String>());
併發容器 J.U.C(比同步容器更適合高併發)
ArrayList -> CopyOnWriteArrayList
寫寫纔會阻塞,寫不阻塞讀。 適合大小比較小且讀多寫少的場景
HashSet -> CopyOnWriteArraySet
適合大小比較小且讀多寫少的場景
TreeSet(大小順序) -> ConcurrentSkipListSet(同步+大小順序)
適合大小比較小且讀多寫少的場景
HashMap -> ConcurrentHashMap(同步)
鎖分段技術-數據分紅一段一段存儲(一段對應一個hashEntry數組,每一個數組是一個鏈表結構的元素) ,爲每一段數據分配一把鎖,多線程訪問不一樣數據段時,就不會產生競爭了。
TreeMap(大小順序) -> ConcurrentSkipListMap(同步+大小順序)
ConcurrentLinkedQueue 高效的併發隊列,是高併發中性能最好的隊列,先進先出,使用鏈表實現。入隊了出隊都採用CAS算法。(線程安全的LinkedList)