Java基礎【六】 - 集合框架彙總

集合使用場景

集合容器主要用於保存對象。集合容器主要分爲以下四類形式保存:
一、List 有序、重複的集合。
二、Set 無序、不可重複。
三、Queue 保持一個隊列(先進先出)的順序。
四、Map 鍵值對存儲。算法

集合架構層次關係圖

圖片描述

集合接口

圖片描述

集合實現類(含抽象類)

圖片描述
圖片描述
圖片描述

List和Set的區別

一、Set 接口實例存儲的是無序的,不重複的數據。List 接口實例存儲的是有序的,能夠重複的元素。
二、Set檢索效率低下,刪除和插入效率高,插入和刪除不會引發元素位置改變 ,實現類有HashSet,TreeSet。
三、List和數組相似,能夠動態增加,根據實際存儲的數據的長度自動增加List的長度。查找元素效率高,插入刪除效率低,由於會引發其餘元素位置改變 ,實現類有ArrayList,LinkedList,Vector,CopyOnWriteArrayList。數組

ArrayList與Vector的區別

一、二者都是基於索引,內部結構是數組。
二、元素存取有序並都容許爲null。
三、都支持fail-fast機制。
四、Vector是同步的,不會過載,而ArrayList不是,但ArrayList效率比Vector高,若是在迭代中對集合作修改可使用CopyOnWriteArrayList。
五、初始容量都爲10,但ArrayList默認增加爲原來的50%,而Vector默認增加爲原來的一倍;ArrayList更通用,可使用Collections工具類獲取同步列表和只讀列表。安全

Vector是線程同步的,因此它也是線程安全的,而ArrayList是線程異步的,是不安全的。若是不考慮到線程的安全因素,通常用ArrayList效率比較高。
若是集合中的元素的數目大於目前集合數組的長度時,在集合中使用數據量比較大的數據,用Vector有必定的優點。數據結構

ArrayList與LinkedList的區別

一、二者都是List接口的實現類。
二、ArrayList是基於動態數組的數據結構,而LinkedList是基於鏈表的數據結構。
三、對於隨機訪問get和set(查詢操做),ArrayList要優於LinkedList,由於LinkedList要移動指針。
四、對於增刪操做(add和remove),LinkedList優於ArrayList。多線程

當須要對數據進行對此訪問的狀況下選用ArrayList,當須要對數據進行屢次增長刪除修改時採用LinkedList。
CopyOnWriteArrayList
一、CopyOnWriteArrayList是ArrayList的線程安全的變體,其中的全部可變操做(add, set等)都是對底層數組進行一次新的複製來實現的,相比ArrayList的要慢一些,適用於讀多寫少的場景。
二、在併發操做容器對象時不會拋出ConcurrentModificationException,而且返回的元素與迭代器建立時的元素是一致的。
三、容器對象的複製須要必定的開銷,若是對象佔用內存過大,可能形成頻繁的YoungGC和Full GC 。
四、CopyOnWriteArrayList不能保證數據實時一致性,只能保證最終一致性。架構

HashMap和HashTable的區別

一、都是基於hash表實現的,每一個元素都是key-value對,內部都是經過單向鏈表解決衝突,容量都會自動增加HashMap默認容量爲16,每次擴容變爲原來的2倍,HashTable初始容量爲11,每次擴容變爲原來的2倍加1。
二、HashMap繼承自AbstractMap類,HashTable繼承自Dictionary類。
三、HashTable是同步的,適合多線程環境,而HashMap不是,但效率相對較高。
四、HashMap容許key和value爲null,而HashTable不容許。
五、Hash值的使用不一樣,HashTable直接使用對象的hashcode值,而HashMap從新計算hash值。
六、在Java1.4中引入了HashMap的子類LinkedHashMap,若須要遍歷順序,能夠從HashMap轉向LinkedHashMap, 而HashTable的順序是不可預知的。
七、HashMap提供對key的Set進行遍歷,所以它支持fail-fast機制,而HashTable提供對key的Enumeration進行遍歷,不支持fail-fast。
八、HashTable被認爲是個遺留的類,若是在迭代的時候修改Map,可使用ConcurrentHashMap(Java5出現)
九、HashTable產生於JDK1.1,而HashMap產生於JDK1.2。併發

HashSet與TreeSet

一、HashSet不能保證元素的排列順序,TreeSet是SortedSet接口的惟一實現類,能夠確保集合元素處於排序狀態
二、HashSet底層用的是哈希表,TreeSet採用的數據結構是紅黑樹
三、HashSet中元素能夠是null,但只能有一個,TreeSet不容許放入null異步

HashSet是基於Hash算法實現的,其性能一般都優於TreeSet。咱們一般都應該使用HashSet,在咱們須要排序的功能時,咱們才使用TreeSet。工具

HashMap和ConcurrentHashMap的區別

一、HashMap不是線程安全的,而ConcurrentHashMap是線程安全的。
二、ConcurrentHashMap採用鎖分段技術,將整個Hash桶進行了分段segment,也就是將這個大的數組分紅了幾個小的片斷segment,並且每一個小的片斷segment上面都有鎖存在,那麼在插入元素的時候就須要先找到應該插入到哪個片斷segment,而後再在這個片斷上面進行插入,並且這裏還須要獲取segment鎖。
三、ConcurrentHashMap讓鎖的粒度更精細一些,併發性能更好。性能

Enumeration和Iterator的區別

一、Enumeration是JDK1.0出現的,只能讀取集合的數據。
Iterator是JDK1.2出現的,用來替代Enumeration,增長了remove()方法,能夠在迭代過程當中移除元素 。
二、Iterator的方法名是標準化的 。
三、Iterator支持fail-fast機制,而Enumeration不支持 。
四、Enumeration的內存佔用較少,效率比Iterator高,但Iterator更安全。

Iterator和ListIterator的區別

一、ListIterator繼承自Iterator接口,而後添加了一些額外的功能 。
二、二者都有hasNext()和next()方法,能夠實現順序向後遍歷,ListIterator還有hasPrevious()和previous()方法,能夠實現逆序遍歷 。
三、都有remove()方法能夠實現刪除對象,ListIterator還有添加方法add()和修改方法set(),能夠實現添加和修改對象,Iterator的協議不能確保迭代的次序,因此沒有提供add()方法 。
四、Iterator能夠遍歷Set和List集合,而ListIterator只能遍歷List集合 。
五、ListIterator有nextIndex()和previousIndex()方法,能夠定位當前的索引位置,Iterator沒有此功能。

若是內容對你有幫助但願點贊收藏謝謝!!!

相關文章
相關標籤/搜索