集合框架總結-序
集合框架初步學習後,打算寫下此係列文章總結
本文只做總的概述,不對某個集合進行詳細解析
詳細解析請移步同系列其他文章
Java Map遍歷方式的選——TreeMap、HashMap的key、value遍歷與效率分析
目錄
-
集合框架體系
(圖源傳智播客 侵刪)
Collection(單列集合)
|--List 有序,可重複
|--ArrayList
底層資料結構是陣列,查詢快,增刪慢。
執行緒不安全,效率高
|--Vector
底層資料結構是陣列,查詢快,增刪慢。
執行緒安全,效率低
|--LinkedList
底層資料結構是連結串列,查詢慢,增刪快。
執行緒不安全,效率高
|--Set 無序,唯一 (只能用迭代器 沒有了get方法)
|--HashSet
底層資料結構是雜湊表
如何保證元素唯一性
依賴兩個方法:hashCode()和equals()
開發中自動生成這兩個方法即可
|--LinkedHashSet
底層資料結構是連結串列和雜湊表
由連結串列保證元素有序 (儲存與取出順序一致)
由雜湊表保證元素唯一
|--TreeSet
底層資料結構是紅黑樹
如何保證元素排序
自然排序 泛型重寫實現Comparable介面 重寫compare(T o1, T o2)方法
比較器排序 建構函式實現Comparator介面 重寫CompareTo(T o)方法
如何保證元素唯一性
根據比較的返回值是否是0來決定
Map(雙列集合)
|--HashMap
底層資料結構是雜湊表(陣列+連結串列)和紅黑樹 PS:JDK8之前只是雜湊表 沒有紅黑樹 JDK8中紅黑樹也只是作為補充
由雜湊表保證鍵唯一 注意只是鍵唯一 值並不唯一
元素以鍵值對方式儲存,通過鍵可以對映到值 習慣上將HashMap<K,V>的物件稱為雜湊對映
|--LinkedHashMap
底層資料結構是雜湊表+連結串列
由雜湊表保證鍵唯一 連結串列保證元素有序 (儲存與取出順序一致)
元素以鍵值對方式儲存,通過鍵可以對映到值
|--TreeMap
底層資料結構是雜湊表(陣列+連結串列)和紅黑樹
由雜湊表保證鍵唯一 紅黑樹實現排序
-
如何選擇集合的使用
集合框架體系龐大,要想合理的使用集合必須先了解集合的特點,而各自的特點其實通過集合的名字就已經可以瞭解大概
- ArrayXxx:底層資料結構是陣列,查詢快,增刪慢
- LinkedXxx:底層資料結構是連結串列,查詢慢,增刪快
- HashXxx:底層資料結構是雜湊表。依賴兩個方法:hashCode()和equals()
- TreeXxx:底層資料結構是二叉樹。兩種方式排序:自然排序和比較器排序
通過命名規律,我們便可以在特定的場景選擇合適的集合了
當難以判斷用Collection體系還是Map體系時 用Collection體系
Collection
唯一嗎?
是:Set
排序嗎?
是:TreeSet
否:HashSet
要儲存與取出順序一致: LinkedHashSet
如果你知道是Set,但是不知道是哪個Set,就用HashSet
否:List
要執行緒安全嗎?
是:Vector
否:ArrayList或者LinkedList
查詢多:ArrayList
增刪多:LinkedList
如果你知道是List,但是不知道是哪個List,就用ArrayList
如果需要以鍵值對方式儲存物件 則使用Map體系
Map
要執行緒安全嗎?
是:Hashtable(注意! Hashtable不屬於Map體系 只是用法相似 其繼承自java.util.Dictionary<K,V>)
否: HashMap/TreeMap
要排序嗎?
是:TreeMap
否: HashMap
要儲存與取出順序順序一致: LinkedHashMap
如果你知道是Map,但不知道用哪個Map,就用HashMap
一般情況下,用ArrayList足以應對大多數情況了,因為我們可以使用Collections工具來對集合進行進一步操作
- public static <T> void sort(List<T> list):排序 預設情況下是自然順序。
- public static <T> void sort(List<T> list,Comparator<? super T> c): 使用比較器指定的排序方式進行排序
- public static <T> int binarySearch(List<?> list,T key):二分查詢
- public static <T> T max(Collection<?> coll):最大值
- public static void reverse(List<?> list):反轉
- public static void shuffle(List<?> list):隨機置換
- public static <T> List<T> synchronizedList(List<T> list):返回由指定列表支援的同步(執行緒安全)列表
值的一提的是 使用 synchronizedList方法返回的執行緒安全集合,並對其迭代時要加上同步鎖 否則可能會有不可預料的結果
以下源自API
在迭代時,使用者必須在返回的列表上手動同步:
List list = Collections.synchronizedList(new ArrayList());
...
synchronized (list) {
Iterator i = list.iterator(); // Must be in synchronized block
while (i.hasNext())
foo(i.next());
}