Java:List,Map,Set底層實現


 1 ArrayList實現原理要點概括
 2 參考文獻: 
 3 http://zhangshixi.iteye.com/blog/674856l 
 4 https://www.cnblogs.com/leesf456/p/5308358.html
 5 ArrayList是List接口的可變數組非同步實現,並允許包括null在內的所有元素。
 6 底層使用數組實現
 7 該集合是可變長度數組,數組擴容時,會將老數組中的元素重新拷貝一份到新的數組中,每次數組容量增長大約是其容量的1.5倍,這種操作的代價很高。
 8 采用了Fail-Fast機制,面對並發的修改時,迭代器很快就會完全失敗,而不是冒着在將來某個不確定時間發生任意不確定行為的風險
 9 remove方法會讓下標到數組末尾的元素向前移動一個單位,並把最后一位的值置空,方便GC
10 LinkedList實現原理要點概括
11 參考文獻: 
12 1.http://www.cnblogs.com/ITtangtang/p/3948610.htmll 
13 2.https://www.cnblogs.com/leesf456/p/5308843.html
14 LinkedList是List接口的雙向鏈表非同步實現,並允許包括null在內的所有元素。
15 底層的數據結構是基於雙向鏈表的,該數據結構我們稱為節點
16 雙向鏈表節點對應的類Node的實例,Node中包含成員變量:prev,next,item。其中,prev是該節點的上一個節點,next是該節點的下一個節點,item是該節點所包含的值。
17 它的查找是分兩半查找,先判斷index是在鏈表的哪一半,然后再去對應區域查找,這樣最多只要遍歷鏈表的一半節點即可找到
18 HashMap實現原理要點概括
19 參考文獻:http://zhangshixi.iteye.com/blog/672697 
20 參考文獻:http://blog.csdn.net/lizhongkaide/article/details/50595719
21 HashMap是基於哈希表的Map接口的非同步實現,允許使用null值和null鍵,但不保證映射的順序。
22 底層使用數組實現,數組中每一項是個單向鏈表,即數組和鏈表的結合體;當鏈表長度大於一定閾值時,鏈表轉換為紅黑樹,這樣減少鏈表查詢時間。
23 HashMap在底層將key-value當成一個整體進行處理,這個整體就是一個Node對象。HashMap底層采用一個Node[]數組來保存所有的key-value對,當需要存儲一個Node對象時,會根據key的hash算法來決定其在數組中的存儲位置,在根據equals方法決定其在該數組位置上的鏈表中的存儲位置;當需要取出一個Node時,也會根據key的hash算法找到其在數組中的存儲位置,再根據equals方法從該位置上的鏈表中取出該Node。
24 HashMap進行數組擴容需要重新計算擴容后每個元素在數組中的位置,很耗性能
25 采用了Fail-Fast機制,通過一個modCount值記錄修改次數,對HashMap內容的修改都將增加這個值。迭代器初始化過程中會將這個值賦給迭代器的expectedModCount,在迭代過程中,判斷modCount跟expectedModCount是否相等,如果不相等就表示已經有其他線程修改了Map,馬上拋出異常
26 Hashtable實現原理要點概括
27 參考文獻:http://blog.csdn.net/zheng0518/article/details/42199477
28 Hashtable是基於哈希表的Map接口的同步實現,不允許使用null值和null鍵
29 底層使用數組實現,數組中每一項是個單鏈表,即數組和鏈表的結合體
30 Hashtable在底層將key-value當成一個整體進行處理,這個整體就是一個Entry對象。Hashtable底層采用一個Entry[]數組來保存所有的key-value對,當需要存儲一個Entry對象時,會根據key的hash算法來決定其在數組中的存儲位置,在根據equals方法決定其在該數組位置上的鏈表中的存儲位置;當需要取出一個Entry時,也會根據key的hash算法找到其在數組中的存儲位置,再根據equals方法從該位置上的鏈表中取出該Entry。
31 synchronized是針對整張Hash表的,即每次鎖住整張表讓線程獨占
32 ConcurrentHashMap實現原理要點概括
33 參考文獻:http://blog.csdn.net/zheng0518/article/details/42199477
34 ConcurrentHashMap允許多個修改操作並發進行,其關鍵在於使用了鎖分離技術。
35 它使用了多個鎖來控制對hash表的不同段進行的修改,每個段其實就是一個小的hashtable,它們有自己的鎖。只要多個並發發生在不同的段上,它們就可以並發進行。
36 ConcurrentHashMap在底層將key-value當成一個整體進行處理,這個整體就是一個Entry對象。Hashtable底層采用一個Entry[]數組來保存所有的key-value對,當需要存儲一個Entry對象時,會根據key的hash算法來決定其在數組中的存儲位置,在根據equals方法決定其在該數組位置上的鏈表中的存儲位置;當需要取出一個Entry時,也會根據key的hash算法找到其在數組中的存儲位置,再根據equals方法從該位置上的鏈表中取出該Entry。
37 與HashMap不同的是,ConcurrentHashMap使用多個子Hash表,也就是段(Segment)
38 ConcurrentHashMap完全允許多個讀操作並發進行,讀操作並不需要加鎖。如果使用傳統的技術,如HashMap中的實現,如果允許可以在hash鏈的中間添加或刪除元素,讀操作不加鎖將得到不一致的數據。ConcurrentHashMap實現技術是保證HashEntry幾乎是不可變的。
39 HashSet實現原理要點概括
40 參考文獻:http://zhangshixi.iteye.com/blog/673143l
41 HashSet由哈希表(實際上是一個HashMap實例)支持,不保證set的迭代順序,並允許使用null元素。
42 基於HashMap實現,API也是對HashMap的行為進行了封裝,可參考HashMap
43 LinkedHashMap實現原理要點概括
44 參考文獻:http://zhangshixi.iteye.com/blog/673789l
45 LinkedHashMap繼承於HashMap,底層使用哈希表和雙向鏈表來保存所有元素,並且它是非同步,允許使用null值和null鍵。
46 基本操作與父類HashMap相似,通過重寫HashMap相關方法,重新定義了數組中保存的元素Entry,來實現自己的鏈接列表特性。該Entry除了保存當前對象的引用外,還保存了其上一個元素before和下一個元素after的引用,從而構成了雙向鏈接列表。
47 LinkedHashSet實現原理要點概括
48 參考文獻:http://zhangshixi.iteye.com/blog/673319l
49 對於LinkedHashSet而言,它繼承與HashSet、又基於LinkedHashMap來實現的。LinkedHashSet底層使用LinkedHashMap來保存所有元素,它繼承與HashSet,其所有的方法操作上又與HashSet相同。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM