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雙端隊列接口。