Java進階——01集合篇
Java集合
01 Collection圖解
-
List , Set, Map都是介面,前兩個繼承至Collection介面,Map為獨立介面
注意:
-
Queue介面與List、Set同一級別,都是繼承了Collection介面。
-
LinkedList既可以實現Queue介面,也可以實現List介面。Queue介面窄化了對LinkedList的方法的訪問許可權(即在方法中的引數型別如果是Queue時,就完全只能訪問Queue介面所定義的方法 了,而不能直接訪問 LinkedList的非Queue的方法)
-
SortedSet是個介面,它裡面的(只有TreeSet這一個實現可用)元素一定是有序的。
02 Collection集合方法
03 常用集合的分類
04 List詳解
05 Set詳解
-
HashSet
底層資料結構是雜湊表。(無序,唯一) ps: 如何來保證元素唯一性?
依賴兩個方法:hashCode()和equals()
-
LinkedHashSet
底層資料結構是連結串列和雜湊表。(FIFO插入有序,唯一)
1.由連結串列保證元素有序
2.由雜湊表保證元素唯一
-
TreeSet
底層資料結構是紅黑樹。(唯一,有序)
-
如何保證元素排序的呢?自然排序比較器排序
-
如何保證元素唯一性的呢?根據比較的返回值是否是0來決定
小結
-
TreeSet的主要功能用於排序
-
LinkedHashSet的主要功能用於保證FIFO即有序的集合(先進先出)
-
HashSet只是通用的儲存資料的集合
06 Collection小結
針對Collection集合我們到底使用誰呢?(掌握)
唯一嗎?
是:Set
排序嗎?
是:TreeSet或LinkedHashSet
否:HashSet
如果你知道是Set,但是不知道是哪個Set,就用HashSet。
否:List
要安全嗎?
是:Vector
否:ArrayList或者LinkedList
查詢多:ArrayList
增刪多:LinkedList
如果你知道是List,但是不知道是哪個List,就用ArrayList。
如果你知道是Collection集合,但是不知道使用誰,就用ArrayList。
如果你知道用集合,就用ArrayList。
07 Map
Map介面有三個比較重要的實現類,分別是HashMap、TreeMap和HashTable。
-
TreeMap是有序的,HashMap和HashTable是無序的。
-
Hashtable的方法是同步的,HashMap的方法不是同步的。這是兩者最主要的區別。
這就意味著:
-
Hashtable是執行緒安全的,HashMap不是執行緒安全的。
-
HashMap效率較高,Hashtable效率較低。
如果對同步性或與遺留程式碼的相容性沒有任何要求,建議使用HashMap。 檢視Hashtable的原始碼就可以發現,除建構函式外,Hashtable的所有 public 方法宣告中都有 synchronized關鍵字,而HashMap的原始碼中則沒有。
-
Hashtable不允許null值,HashMap允許null值(key和value都允許)
-
父類不同:Hashtable的父類是Dictionary,HashMap的父類是AbstractMap
小結:
-
HashMap 非執行緒安全
-
HashMap:基於雜湊表實現。使用HashMap要求新增的鍵類明確定義了hashCode()和equals()[可以重寫hashCode()和equals()],為了優化HashMap空間的使用,您可以調優初始容量和負載因子。
-
TreeMap:非執行緒安全基於紅黑樹實現。TreeMap沒有調優選項,因為該樹總處於平衡狀態。
適用場景分析:
-
HashMap和HashTable:HashMap去掉了HashTable的contains方法,但是加上了containsValue()和containsKey()方法。HashTable同步的,而HashMap是非同步的,效率上比HashTable要高。
-
HashMap:適用於Map中插入、刪除和定位元素。
-
Treemap:適用於按自然順序或自定義順序遍歷鍵(key)。
08 小結
LinkedList、ArrayList、HashSet是非執行緒安全的,Vector是執行緒安全的;
HashMap是非執行緒安全的,HashTable是執行緒安全的;
StringBuilder是非執行緒安全的,StringBuffer是執行緒安全的。
ArrayXxx:底層資料結構是陣列,查詢快,增刪慢
LinkedXxx:底層資料結構是連結串列,查詢慢,增刪快
HashXxx:底層資料結構是雜湊表。依賴兩個方法:hashCode()和equals()