【JDK】:Java容器框架

容器框架概述

在JDK8中rt.jar文件中,java.util.*;包中的容器主要包括List、Set、Queue和Map四個大類,其中List、Set、Queue是和Collection接口相關的容器,而Map是單獨列出來的容器。使用astah community版繪製了容器框架的類圖。

Collection的List、Set、Queue類圖如下:

容器框架

Map容器的類圖如下:

Map容器

注意到上面的類圖中有幾個單獨列出的接口或者類:

  • Comparator
    比較器接口,最重要的是compare()方法,對於容器中存儲元素item的排序(包括自定義排序等)有重要作用,如果使用的是有序容器(SortedSet、SortedMap、TreeMap),則存放的元素必須是可進行比較的,需要實現Comparator接口。
  • RandomAccess
    隨機存取接口,實現容器的隨機存取,如ArrayList、Vector(相當於同步的ArrayList)等。
  • Iterator和ListIterator
    Iterator接口使用了迭代器設計模式來對所有的容器進行快速遍歷,容器本身不需要關注存儲元素item的數據類型(具體是什麼類),這些確定類型和轉型的工作由iterator負責實現。
    ListIterator是List容器所獨有的迭代器,與一般的Iterator相比,ListIterator包含add()、hasPrevious()、previous()、nextIndex()等方法,能夠在遍歷過程中修改集合、逆向順序遍歷、定位遍歷索引;而Iterator只能遍歷不能修改、只能順向順序遍歷、不能定位索引。
  • Iterable
    Iterable是java.lang*;包中的接口,實現該接口的類能後實現“For-each loop”,不要將其與Iterator和ListIterator迭代器混淆。”For-each loop“是增強for循環,例如對於一個ArrayList容器的循環,使用增強for循環能夠簡化代碼,提高效率:
// Iterator迭代器循環模式
ArrayList<Integer> list = new ArrayList<Integer>();
for(Iterator it = list.iterator(); it.hasNext(); ) 
    System.out.println(it.next());  // 自動拆箱成int輸出

// For-each loop模式
for(Integer i : list)
    System.out.println(i);
  • Arrays和Collections
    Arrays是關於數組的封裝類,封裝了對數組操作的多種方法,如sort()、copyOf()、binarySearch()、asList()等方法;Collections封裝了很多對於容器的操作,如max()、min()、reverse()、sort()等方法,生成同步容器如Collections.synchronizedList()、Collections.synchronizedSet()等。

Set

Set實現了數學中的“集合”容器,一般是不可重複,無序,最多隻有一個null值。

Set容器

其子容器主要包括:

  • AbstractSet:抽象集合類,實現了equals()和hashCode()方法
  • SortedSet:有序(默認自然序)
  • NavigableSet:繼承自SortedSet
  • TreeSet:實現NavigableSet接口,繼承AbstractSet
  • HashSet:hash方式存儲(實際上是一個Map的實例)
  • LinkedHashSet:雙向循環鏈表,不可重複,順序與插入順序保持一致,或者實現自定義的順序
  • EmumSet:只能存放Emum枚舉類型

List

List是List集合類的最上層接口,相當於實現了書序總的“集合”,主要是針對數組和鏈表。List是一般是可重複、無序、可添加null值的。

List容器

List子容器主要包括:

  • ArrayList:數組實現,隨機存取
  • LinkedList:雙向循環鏈表,順序存取
  • Vector:同步,其他與ArrayList相同
  • Stack:同步,繼承自Vector,“先進後出”

Queue

Queue實現了數據結構中的隊列,“先進先出”,

Queue容器

主要的子容器包括:

  • AbstractQueue:抽象隊列
  • PriorityQueue:繼承自AbstractQueue,數據結構中堆Heap的實現
  • Deque:雙端隊列,兩端都可以插入和刪除
    • 輸出受限的雙端隊列
      輸出受限雙端隊列
    • 輸入受限的雙端隊列
      輸入受限雙端隊列

Map

Map容器是利用映射關係來存儲鍵值對的,獨立於List、Set、Queue。鍵值對是一一對應的關係,一般允許鍵值爲空,不可重複,是完全抽象類Dictionary的接口版本。

Map容器

Map的子容器主要包括:

  • AbstractMap:實現了內部EntrySet接口,實現equals、hashCode方法
  • SortedMap:有序(默認自然序)
  • NavigableMap:繼承自SortMap
  • TreeMap:基於紅黑樹,實現NavigableMap接口,繼承Abstractmap
  • HashMap:非同步,允許null
  • LinkedHashMap:非同步,允許null,雙向循環鏈表,順序與插入順序一致(類比於LinkedHashSet),或者實現自定義順序
  • HashTable:同步,不允許null
  • EmumMap:只能存放Emum枚舉類型
  • WeakHashMap:弱鍵(weak key)映射,允許釋放映射所指向的對象,爲解決某類特殊問題而設計。如果映射之外沒有應用指向某個“鍵”,則該“鍵”可以被GC回收
  • IdentityHashMap:使用“==”代替equals()對鍵進行比較的散列映射,專門爲解決特殊問題而設計
  • ConcurrentHashMap:線程安全的Map,屬於java.util.concurrent併發包中
發佈了117 篇原創文章 · 獲贊 184 · 訪問量 44萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章