前幾天其實一直在學習關於linux的內容和kvm虛擬化的知識。今天有時間來回顧一下集合相關的知識,接下來我將帶你們一塊兒來回顧一塊兒集合關聯的知識。java
不要辜負本身花費時間作的事情,只有用心才能獲得真心的回報!linux
關於java集合框架的知識:大體可分爲Set、List和Map三種體系,其中Set表明無序、不可重複的集合;List表明有序、重複的集合;而Map則表明具備映射關係的集合。Java 5以後,增長了Queue體系集合,表明一種隊列集合實現。數組
Java集合框架主要由Collection和Map兩個根接口及其子接口、實現類組成。安全
集合類劃分爲兩個大的部分:一種是能夠按照必定順序進行迭代訪問的集合類;一種是通過名值對的映射創建關係進行訪問的集合類數據結構
1.一、collection接口概述多線程
Collection接口是全部後續集合類型的一個公共抽象定義。它自己沒有一個直接的實現,更多的是各類不一樣的集合類型在它的基礎上繼承了更多特殊的特性並作了一個實現。併發
Collection接口裏主要定義了一些做爲集合類型比較通用的方法,好比說size, isEmpty, add, remove等。做爲集合類型比較通用的一個定義,它主要用在一些須要比較高級別抽象的地方。好比說咱們須要能夠對全部集合類型進行通用操做。 框架
1.二、Collection接口定義的方法性能
(1)增長、add(E e) - 返回值爲boolean(是否添加成功)。
(2)清除、clear() - 除去此數組的全部操做。
(3)是否包含某一元素、contains(Object o) - 若是包含返回爲true(能夠用於進行if判斷),若是集合裏邊的元素爲自定義
類的話須要重寫自定類的equals方法(contains方法就是基於equals實現的)不然比較的是地址。
(4)比較此collection與指定對象是否相等、equals(Object o) - 返回值爲boolean(true爲相等)。
(5)此collection是否包含某元素、isEmpty() - 返回值爲boolean(true爲不包含)。
(6)獲取此collection的迭代器、iterator() - 用於遍歷集合(此迭代器只能遍歷集合,不能對集合進行修改,不然會報併發
修改異常-ConcurrentModificationException)。
(7)刪除指定元素、remove(Object o) - 返回值爲boolean(true表示刪除成功)。
(8)返回元素數(集合的長度)、size() - 返回值爲int(集合中元素的個數)。
(9)返回此集合中全部元素的數組、toArray() - 返回值是一個數組。
在經常使用的集合類型中,HashSet, TreeSet等具體的實現每每不同。好比說HashSet自己的實現是引用了HashMap做爲內部的元素。若是咱們仔細檢查他們的結構實現,會發現有的類型咱們也能夠經過foreach的循環來遍歷。學習
這是由於他們有的在實現Set定義接口的範圍同時也繼承了實現Collection接口的部分。能夠說是二者兼有之。
在上面這些集合類型中,基於Hash表實現的主要有HashSet, LinkedHashSet。基於紅黑樹實現的有TreeSet.
特色:無順序,不可重複
1)HashSet
不能保證元素的排列順序,加入的元素要特別注意hashCode()方法的實現。
HashSet不是同步的,多線程訪問同一步HashSet對象時,須要手工同步
集合元素值能夠是null。
2)LinkedHashSet
LinkedHashSet類也是根據元素的hashCode值來決定元素的存儲位置,但它同時使用鏈表維護元素的次序。與HashSet相比,特色:
對集合迭代時,按增長順序返回元素。
性能略低於HashSet,由於須要維護元素的插入順序。但迭代訪問元素時會有好性能,由於它採用鏈表維護內部順序。
3)TreeSet
TreeSet類是SortedSet接口的實現類。由於須要排序,因此性能確定差於HashSet。
4)EnumSet類
專爲枚舉類設計的集合類,EnumSet中的全部元素都必須是指定枚舉類型的枚舉值
List類型的數據結構算是咱們平時接觸最多並且看起來最簡單的數據結構類型。最經常使用的兩種是ArrayList和LinkedList,也就是咱們常說的線性表和鏈表。
1)LinkedList類
內部使用鏈表的形式來存儲數據,在增長和刪除數據上面性能更好
它實現了List接口和Deque接口,說明它具備兩邊接口的特性,所以它能夠看成一個雙端隊列來用,也能夠看成棧來用,而且它是以鏈表的形式來實現的,因此查詢性能差,可是增長和刪除操做性能高。
2)ArrayList類
內部使用數組來存儲數據,也就至關於數據結構的順序表存儲,在查詢數據上面性能好,
3)Vertor類
跟ArrayList相比,它是線程安全的,而ArrayList是線程不安全的,
4)Stack類繼承Vertor類
看名字,其實就是方便模擬「棧」這種數據結構
用於模擬隊列這種數據結構,而後該接口中聲明瞭一些基本操做的方法。例如:add、offer、remove等
1)PriorityQueue類
PriorityQueue保存隊列元素的順序並非按照加入隊列的順序,而是按隊列元素的大小從新排序
2)Deque接口
Deque表明一個雙端隊列,能夠看成一個雙端隊列使用,也能夠看成「棧」來使用,由於它包含出棧pop()與入棧push()方法。
3)ArrayDeque類爲Deque的實現類
也就是實現了Deque接口中定義的方法,解釋跟deque差很少
數組:是以一段連續內存保存數據的;隨機訪問是最快的,但不支持插入、刪除、迭代等操做。
ArrayList與ArrayDeque:以數組實現;隨機訪問速度還行,插入、刪除、迭代操做速度通常;線程不安全。
Vector:以數組實現;隨機訪問速度通常,插入、刪除、迭代速度不太好;線程安全的。
LinkedList:以鏈表實現;隨機訪問速度不太好,插入、刪除、迭代速度很是快。
Map接口:定義一些基本的操做,例如put(key,value), containKey(Object key)等一系列操做。
使用key、value鍵值對的形式進行訪問的集合類
1)HashMap類和Hashtable類對比,
通常使用HashMap,由於Hashtable類是很古老的,據查都不建議用。日常咱們也是用HashMap
HashMap類是線程不安全的,而Hashtable是線程安全的
HashMap類可使用null做爲key和value,而Hashtable不能夠
2)Properties類繼承Hashtable類
增長了額外的一些方法,例如:load(InputStream inStream)從屬性文件加載key-value等方法。
能夠將key-value用xml文件的格式保存,可能就是跟xml文件打一些交道
3)LinkedHashMap類繼承HashMap類
LinkedHashMap從HashMap類繼承而來。以鏈表來維護內部順序。不少方面跟LinkedHashSet相似。LinkedHashMap它能夠記住key-value對的添加時的順序, 同時避免使用TreeMap時性能受到的影響。
4)SortedMap接口和TreeMap實現類
相似於SortedSet及TreeSet,TreeMap也能夠自定義比較器(Comparable)實現定製排序。它的額外提供的方法也與TreeSet相似,增長了訪問第一個、前一個、後一個、最後一個key-value對的方法,並
提供了從TreeMap中提取子集的方法。TreeMap不容許null做爲key,要否則怎麼比較呢?
5)IdentityHashMap類
與HashMap的不一樣在於,只有兩個key嚴格相等(key1 == key2)時,IdentityHashMap才認爲兩個key相等;而對於普通HashMap而言,只要key1.equals(key2)且hashCode相同便可。一樣容許null值,不能保證順序。
6)EnumMap類
EnumMap是一個與枚舉類一塊兒使用的Map實現。它的key必須是單個枚舉類的枚舉值。EnumMap不容許使用null做爲key,但可做爲value。
正常狀況使用HashMap,而不是Hashtable。
若是考慮排序,那麼考慮使用TreeMap。一般TreeMap比HashMap等在插入、刪除操做時要慢很多,由於它須要在底層採用紅黑樹來管理key-value對。
若是考慮插入時的順序,那麼使用LinkedHashMap是個不錯的選擇。
若是想優化垃圾回收,建議使用WeakHashMap實現類(本文未說起);要求key徹底匹配(同一對象),則使用IdentityHashMap;還有枚舉類很少說了。
關於null值:Hashtable不容許key爲null,也不容許value爲null;TreeMap與EnumMap不容許key爲null;HashMap及其子類LinkedHashMap,IdentityHashMap容許key爲null。