抽象容器類
用法和特點
容器類有兩個根接口,分別是Collection 和 Map ,Collection表示單個元素的集合,Map表示鍵值對的集合 。
Collection
Collection表示的數據集合有基本的增、刪、查、遍歷等方法,但沒有定義元素間的順序或位置,也沒有規定是否有重複元素。
List: 是Collection的子接口,表示有順序或位置的數據集合,增加了根據索引位置進行操作的方法,如:get(int index)
。它有兩個主要的實現類:ArrayList和LinkedList。ArrayList基於數組實現,LinkedList基於鏈表實現;ArrayList的隨機訪問效率很高,但從中間插入和刪除元素需要移動元素,效率較低,LinkedList則正好相反,隨機訪問效率很低,但增刪元素只需要調整鄰近節點的鏈接
Set: 是Collection的接口,沒有增加新的方法,但可以保證不包含重複元素。它有兩個主要的實現類HashSet和TreeSet。HashSet基於哈希表實現,要求鍵重寫hashCode方法,效率更高,但元素間沒有順序;TreeSet基於排序二叉樹實現,元素按比較有序,元素需要實現Comparable接口,或者創建TreeSet時提供一個Comparator對象。HashSet還有一個子類LinkedHashSet可以按插入有序。
Queue: 是Collection的子接口,表示先進先出的隊列,在尾部添加,從頭部查看或刪除。Deque是Queue的子接口,表示更爲通過的雙端隊列,有明確的在頭或尾進行查看、添加和刪除的方法。普通隊列有兩個主要的實現類,LinkedList和ArrayDeque,LinkedList基於鏈表實現,ArrayDeque基於循環數組實現,一般而言,如果只需要Deque接口,ArrayDeque的效率更高一些。
Deque還有一個特殊的實現類PriorityQueue,它表示優先級隊列,內部是用堆實現的,堆除了用於實現優先級隊列,還可以高效方便的解決很多其他問題,比如求前K個最大的元素、求中值等。
Map
Map接口表示鍵值對集合,經常根據鍵進行操作,它有兩個主要的實現類,HashMap和TreeMap。HashMap基於哈希表實現,要求鍵重寫hashCode方法,操作效率很高,但元素沒有順序。TreeMap基於排序二叉樹實現,要求鍵實現Comparable接口,或提供一個Comparator對象,操作效率稍低,但可以按鍵有序。
HashMap還有一個子類LinkedHashMap,它可以按插入或訪問有序。之所以能有序,是因爲每個元素還加入到了一個雙向鏈表中。如果鍵本來就是有序的,使用LinkedHashMap而非TreeMap可以提高效率。按訪問有序的特點可以方便的用於實現LRU緩存。