1. 程式人生 > >Java三大核心集合類詳解

Java三大核心集合類詳解

這裡寫圖片描述

在Java三大核心集合類中,有兩個(List、Set)都繼承自Collection,它的重要性不言而喻。因此在介紹三大集合框架之前,我們先要了解Collection。Collection位於java.util包中,是一個集合介面(集合類的一個頂級介面)。它提供了對集合物件進行基本操作的通用介面方法。
既然講到了集合,什麼是集合?集合的本質上是一種容器,而我們所熟知的陣列本質上也是一種容器,它們二者的主要區別在於:
1.集合可以儲存任意物件資料,而陣列只能儲存單一資料型別的資料
2.陣列的長度不可變,而集合的長度則是可變的

在編寫程式的過程中,使用到集合類,要根據不同的需求,來決定使用哪種集合類,比如,要經常遍歷集合內元素,就要使用List,如果要保證集合中不存在重複的資料,就要用Set;如果要通過某一鍵來查詢某一值,就要使用Map。

List (繼承自Collection)

特點:容量可變、可按索引訪問集合中元素、集合中的元素有序、並且可重複

列表在資料結構中分別表現為:陣列和向量、連結串列、堆疊、佇列。

具體實現類:

  • ArrayList:實現基於陣列,規模可變,適合快速隨機存取,非執行緒安全。
  • LinkedList:實現基於連結串列,適用於順序插入或者刪除。並且提供了List介面中所沒有的獲取頭元素尾元素等方法,可以像佇列、站或者連結串列一樣使用。
  • Vector:實現基於陣列,類似於AarryList,但是執行緒安全,因此效率較低。

Set(繼承自Collection)

Set是一種不包含重複的元素的無序Collection。
特點:集合中的元素不按特定方式排序,只是簡單的把物件加入集合中,就像往口袋裡放東西。對Set中成員的訪問和操作是通過Set中物件的引用進行的,所以集中不能有重複物件。這也是Set與List類的最大區別。

具體實現類:

  • TreeSet:按紅黑樹方式有序不重複
  • HashSet:無序不重複。在HashSet的預設實現中,初始容量16,負載因子為0.75,也就是說當有75%的空間已被使用,將會進行一再雜湊(再雜湊),之前的散列表(陣列)將被刪除,新增加的雜湊是之前散列表長度的2倍,最大值Integer.MAX_VALUE。
  • LinkedHashSet:按放入順序有序不重複

Map

Map是一個單獨的介面,不繼承於Collection。Map是一種把鍵物件和值物件進行關聯的容器。
特點:key不允許重複。

具體實現類:

  • HashMap:實現一個鍵到值對映的雜湊表,通過鍵取得值物件,沒有順序,通過get(key)來獲取value,允許儲存空物件,而且允許鍵是空(由於鍵必須是唯一的,當然只能有一個),不是執行緒安全的。去掉了HashTable中有歧義的的contains()方法,改成了containsKey()和containsValue()方法。
  • HashTable:實現一個映象,所有的鍵必須非空。為了能高效的工作,定義鍵的類必須實現hashcode()方法和equal()方法。是執行緒安全的。
  • TreeMap:基於紅黑樹資料結構的實現。檢視“鍵”或“鍵值對”時,它們會被排序(次序由Comparabel或Comparator決定)。TreeMap的特點在於,你得到的結果是經過排序的。TreeMap是唯一的帶有subMap()方法的Map,它可以返回一個子樹。
  • LinkedHashMap:類似於HashMap,但是迭代遍歷它時,取得“鍵值對”的順序是其插入次序,或者是最近最少使用(LRU)的次序。只比HashMap慢一點。而在迭代訪問時發而更快,因為它使用連結串列維護內部次序。
  • weakHashMao:弱鍵(weak key)Map,Map中使用的物件也被允許釋放: 這是為解決特殊問題設計的。如果沒有map之外的引用指向某個“鍵”,則此“鍵”可以被垃圾收集器回收。

    當元素的順序很重要時選用TreeMap,當元素不必以特定的順序進行儲存時,使用HashMap。Hashtable的使用不被推薦,因為HashMap提供了所有類似的功能,並且速度更快。當你需要在多執行緒環境下使用時,HashMap也可以轉換為同步的。

Tips:
1.SortedSet和SortedMap介面對元素按指定規則排序,SortedMap是對key列進行排序
2.heap和stack有什麼區別
  heap是堆,stack是棧。
  stack的空間由作業系統自動分配和釋放,heap的空間是手動申請和釋放的,heap常用new關鍵字來分配。
  stack空間有限,heap的空間是很大的自由區。
3.這些類的對比與選擇:
如果涉及到堆疊佇列等操作,應該考慮List中的stack,queue
對於需要快速插入刪除元素,應該使用linkedlist
如果需要快速隨機訪問元素,應該選用arraylist
如果程式在單執行緒環境中,選用非同步類
如果在多執行緒中,選用同步類vector、stack和hashtable以及其子類。