數組結構。特色查詢快,不適合對結構的前中部位,進行大量插入,刪除操做,由於會形成數組元素大量遷移。線程不安全,若要線程安全建議用CopyOnWriteArrayList。數組
雙向鏈表結構。自己實現Deque接口,隊列結構。適用於頻繁改變集合結構。好比對結構全部部位的插入,刪除等。因爲雙向鏈表結構特色,對於結構中間部位的操做,內部須要遍歷較長距離,較爲耗時。線程不安全,線程安全可用ConcurrentLinkedDeque。緩存
數組加鏈表的結構,key的對象必須實現equals與hashcode的函數,其中equals方法是爲了防止產生hash衝突,若是多個key哈希一致,若是沒有達到擴容的條件,先是組建鏈表,插入到key對應數組位置的鏈表尾部,在Java8中,若是鏈表過長,則會生成一顆紅黑樹。安全
擴容中,會從新構建內部結構,這個過程是比較耗時的,因此合適的集合容量很重要。因爲內部設計採用位操做來計算hash值對於的位置,實際上最大容量會是,好比16,32,64。函數
線程不安全,線程安全建議用ConcurrentHashMap。spa
繼承HashMap,保持插入順序。AccessOrder爲true時,被訪問的元素放到最尾部,爲false時保留原來的插入順序。線程
比HashMap多維護一個雙向鏈表。遍歷時直接使用此鏈表。非線程安全。設計
弱引用,其中的Entry(繼承WeakReference)只能存活到下一次垃圾回收前,通常用在緩存設計。code
基於紅黑樹的實現,是有序結構,默認new對象時沒有傳入Comparator則按照Comparable接口提供的方法不然用傳入的Comparator進行大小判斷。非線程安全,若是要線程安全,其中一個方法是,用Collections. synchronizedSortedMap處理該對象,返回SortedMap。對象
內部使用了HashMap,只使用了Key,把key單作HashMap的key,其中使用預生成的Object對象當作全部key的value。注意key須要實現,hashcode與equals函數。繼承
每次添加一個值時,開啓鎖,先新建一個數組B,而後複製緩存中的數組A到這個數組B,而後對這個新數組B進行添加操做,然後從新設置list的緩存數組爲B,解鎖。同時使得每次get,for操做都是對過去緩存A進行操做。修改操做與上相似,以此達到線程安全的目的。
對於迭代次數遠遠大於修改次數時,應當用此類,相反時,因爲每次修改將會生成新的數組來替換,因此應當用Collections.synchronizedList()生成的線程安全List。
在沒有可用替代類的狀況下,能夠本身經過組合或則繼承(建議組合,減小沒必要要的非線程安全方法的暴露)的方式,構造線程安全的方法,或則經過Collections.synchronize*() 方法的生成新對象。因爲synchronize*對方法的鎖範圍大,建議儘可能用替代類。