1. 程式人生 > 其它 >Java進階——01集合篇

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

底層資料結構是紅黑樹。(唯一,有序)

  1. 如何保證元素排序的呢?自然排序比較器排序

  2. 如何保證元素唯一性的呢?根據比較的返回值是否是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允許空鍵值,而HashTable不允許。

  • HashMap:適用於Map中插入、刪除和定位元素。

  • Treemap:適用於按自然順序或自定義順序遍歷鍵(key)。

08 小結

LinkedList、ArrayList、HashSet是非執行緒安全的,Vector是執行緒安全的;

HashMap是非執行緒安全的,HashTable是執行緒安全的;

StringBuilder是非執行緒安全的,StringBuffer是執行緒安全的。

ArrayXxx:底層資料結構是陣列,查詢快,增刪慢

LinkedXxx:底層資料結構是連結串列,查詢慢,增刪快

HashXxx:底層資料結構是雜湊表。依賴兩個方法:hashCode()和equals()

TreeXxx:底層資料結構是二叉樹。兩種方式排序:自然排序和比較器排序