容器框架概述
在JDK8中rt.jar文件中,java.util.*;包中的容器主要包括List、Set、Queue和Map四個大類,其中List、Set、Queue是和Collection接口相關的容器,而Map是單獨列出來的容器。使用astah community版繪製了容器框架的類圖。
Collection的List、Set、Queue類圖如下:
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值。
其子容器主要包括:
- AbstractSet:抽象集合類,實現了equals()和hashCode()方法
- SortedSet:有序(默認自然序)
- NavigableSet:繼承自SortedSet
- TreeSet:實現NavigableSet接口,繼承AbstractSet
- HashSet:hash方式存儲(實際上是一個Map的實例)
- LinkedHashSet:雙向循環鏈表,不可重複,順序與插入順序保持一致,或者實現自定義的順序
- EmumSet:只能存放Emum枚舉類型
List
List是List集合類的最上層接口,相當於實現了書序總的“集合”,主要是針對數組和鏈表。List是一般是可重複、無序、可添加null值的。
List子容器主要包括:
- ArrayList:數組實現,隨機存取
- LinkedList:雙向循環鏈表,順序存取
- Vector:同步,其他與ArrayList相同
- Stack:同步,繼承自Vector,“先進後出”
Queue
Queue實現了數據結構中的隊列,“先進先出”,
主要的子容器包括:
- AbstractQueue:抽象隊列
- PriorityQueue:繼承自AbstractQueue,數據結構中堆Heap的實現
- Deque:雙端隊列,兩端都可以插入和刪除
- 輸出受限的雙端隊列
- 輸入受限的雙端隊列
- 輸出受限的雙端隊列
Map
Map容器是利用映射關係來存儲鍵值對的,獨立於List、Set、Queue。鍵值對是一一對應的關係,一般允許鍵值爲空,不可重複,是完全抽象類Dictionary的接口版本。
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併發包中