Java之集合類應用總結

1.集合類類圖

Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
  ├HashSet
  ├TreeSet
  ├LinkedHashSet

Map
├Hashtable
├HashMap
├WeakHashMap
└SortedMap 
   └TreeMap

2.分類介紹

  Collection是最基本的集合接口,JDK提供的類都繼承自Collection的“子接口”,如List和Set。所有實現Collection接口的類都必須提供兩個標準的構造函數:無參數的構造函數和有一個Collection參數的構造函數。前者用於創建一個空的Collection,後者用於創建一個新的Collection,允許用戶複製一個Collection。不論Collection的實際類型如何,它都支持一個iterator()的方法,該方法返回一個迭代子,可逐一訪問Collection中每一個元素。用法如下:

    Iterator it = collection.iterator(); // 獲得一個迭代子
    while(it.hasNext()) {
      Object obj = it.next(); // 得到下一個元素
    }

  由Collection接口派生的兩個接口是List和Set。

1)Collection和Map區別:

  • Collection類型,每個位置只有一個元素。
  • Map類型,持有key-value形式的數據——“鍵值對”,即其元素是成對的對象。

2)Collection子接口List和Set區別:

  • List是有序的Collection,確保維護元素特定的順序,這類似於Java的數組。
  • Set接口不保證維護元素的次序,存入Set的每個元素必須是唯一的加入Set的Object必須定義equals()方法以確保對象的唯一性。

3)List實現類ArrayList、LinkedList和Vector區別

  • ArrayList實現了可變大小的數組,允許對元素進行快速隨機訪問,但是向List中間插入與移除元素的速度很慢(類似動態數組)。它允許所有元素,包括null。ArrayList沒有同步。如果數組長度一定,用數組效率更高。
  • LinkedList插入與刪除元素開銷不大,隨機訪問相比則相對較慢(類似鏈表)。可當堆棧、隊列和雙向隊列使用。 
  • Vector是同步的。當一個Iterator被創建而且正在被使用,另一個線程改變了Vector的狀態,這時將拋出ConcurrentModificationException異常,因此必須捕獲該異常。比ArrayList慢。
  • Stack繼承自Vector,實現一個後進先出的堆棧。同步的。

4)Set實現類HashSet和TreeSet區別

  • HashSet爲快速查找而設計的Set(採用散列函數)。存入HashSet的對象必須定義hashCode()。 它不保證集合的迭代順序;特別是它不保證該順序恆久不變。此類允許使用 null元素。此實現不是同步的。
  • TreeSet保持次序的Set,底層爲紅黑樹。使用它可以從Set中提取有序的序列。 
  • LinkedHashSet: 具有HashSet的查詢速度,且內部使用鏈表維護元素的順序(哈希函數+鏈表)。於是在使用迭代器遍歷Set時,結果會按元素插入的次序顯示。 

5)Map實現類Hashtable、HashMap和WeakHashMap

  • Hashtable是同步的,不允許null。繼承於陳舊的Dictionary類的。
  • HashMap是非同步的,速度比Hashtable快。允許null。HashMap繼承於AbstractMap類。內部Hash數組等於Hashtable不同。Map 中插入、刪除和定位元素,HashMap 是最好的選擇。
  • WeakHashMap是一種改進的HashMap,若一個key不再被外部所引用,那麼該key可以被GC回收。
  • TreeMap中所有元素都保持固定的順序,如果需有序的結果你就應該使用TreeMap(HashMap中元素的排列順序是不固定的)。

3 總結

  • 容器對象僅能持有對象引用(對象的指針),而不是將對象信息Copy一根至數列末位置。
  • 在多線程環境下,對於非同步的結合和Map,可以用類似List list = Collections.synchronizedList(new LinkedList(...));或 Collections.synchronizedMap(originMap) 實現其同步,或者其他手動同步的方法。
  • Map提供的不是對象與數組的關聯,而是對象和對象的關聯。
  • Set只接受不重複的對象。HashSet提供了最快的查詢速度。而TreeSet則保持元素有序。LinkedHashSet保持元素的插入順序。
  • 沒必要再在新代碼裏使用舊類庫留下來的Vector,Hashtable和Stack了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章