Java一些八卦集合類

eddie小英俊發表於2017-11-14

Map 和 Set關係

Map和Set事實基礎的朋友,有著千絲萬縷的聯絡。

Map它可以被看作是Set延期。從何時起Set內容儲存在key-value的值當表單。這個Set實際上可以作為Map使用。反過來,Map事實上,有一個Map.Entry內部介面。而Map在存放值對時,全然不考慮value,而僅僅考慮key,因此Map也能夠看成是一個存key的Set,而value僅僅是key的附屬物。

HashMap加入元素時,依據key的hashCode進行再雜湊計算得到值來決定存放位置。HashMap底層有個陣列Entry[],依據hash值來決定key-value存在陣列的哪個元素,而Entry[]實際上是一個table。

HashSet底層是居於HashMap來實現的。HashSet底層用HashMap來儲存全部元素,這些元素作為HashMap的key,而相應的Value是一個名為PRESENT的static final的Object物件。對HashSet操作的方法都呼叫HashMap的方法進行操作。

元素是否反覆,要同一時候推斷元素物件的hashCode()和equals(),hashCode相等且equals返還true時才覺得是反覆元素,不進行替換。

TreeSet和TreeMap的關係也是非常相似的,即TreeSet底層是採用TreeMap儲存的。TreeMap採用紅黑樹的排序二叉樹來儲存Map中的每一個Entry(樹節點)。

 

List的三個實現:ArrayList,Vector和LinkedList。

Vector還有個兒子Stack,Stack不過在Vector的基礎上加入了5個方法,只五個方法的程式碼就將Vector變成了Stack,Stack依舊是一個Vector,它繼承了Vector的synchronized血統,都是執行緒安全的。從JDK1.6開始,Java提供了Deque介面並提供了實現類ArrayDeque,即使程式中須要棧這種資料結構,也不推薦使用Stack而推薦使用Deque。除非要求執行緒安全。

Deque是雙端佇列。是佇列但同一時候擁有棧的功能。底層都是陣列實現。

Vector差點兒被ArrayList取代了,它唯一的優點是執行緒安全。

如今甚至為了執行緒安全也不用Vector了。能夠通過Collections工具類的synchronizedList()方法將一個普通的ArrayList包裝成執行緒安全的ArrayList。

 

ArrayList 和LinkedList

ArrayList底層是基於陣列實現的。所以ArrayList建立的時候有個初始的capacity,提供了構造方法,程式設計者能夠在建立ArrayList時指定初始的capacity。假設沒有顯式提供capacity,那麼程式預設設定為10.LinkedList是雙向列表儲存結構,不僅實現List介面,還實現Deque雙端佇列介面。

版權宣告:本文部落格原創文章,部落格,未經同意,不得轉載。


本文轉自mfrbuaa部落格園部落格,原文連結:http://www.cnblogs.com/mfrbuaa/p/4637109.html,如需轉載請自行聯絡原作者


相關文章