集合容器概覽
Java世界中,泛型和集合容器的存在大大的提高了程序員的編程能力,是開發者技能百寶箱中的重要武器之一,、因此掌握集合框架的實現原理及內部結構變得非常的重要。本文主要對集合框架體系中日常開發經常遇到的接口、抽象類及其實現類進行梳理,從宏觀上去理解整個集合框架體系,具體實現類的源碼實現原理分析在單獨的博客中進行詳述。
-
集合框架簡圖
Collection接口及其實現類
Collection:Collection接口代表存儲一組獨立元素序列的容器,其代表的容器主要有Set(無序無重復元素)、List(元素按添加的順序存儲,可重復)、Queue(按先進先出的順序存儲元素,多線程環境中常用作隊列)。
Map接口及其實現類
Map:Map接口又稱為關聯數組其代表鍵值對的存儲結構,代表的容器主要有HashMap(采用哈希存儲,無序但查找性能最快)、TreeMap(有序,可自定義排序方式,查找性能遜色於HashMap)、LinkedHashMap(性能上在HashMap和TreeMap之間折中,內部使用鏈表結構存儲,遍歷時按插入順序排序)。
-
常用容器類及接口分析
List
List可將元素維護在特定的序列中,其在Colletion接口的基礎上添加了大量方法,使得可以在List
-
- ArrayList(隨機訪問元素性能較高、向指定位置添加元素需要移動元素,不適用於需要頻繁添加或刪除元素的場景)
- LinkedList(添加或刪除元素性能較高、隨機訪問元素代價較高、特性集較ArrayList更為強大)
圖示方法均繼承自Collection接口,屬於日常開發中常用方法,其中LinkedList同時實現了Deque接口(基於雙端隊列),相比ArrayList功能上更為強大,可用作棧(Stack)或隊列(Queue).
Set
Set可確保添加元素的唯一性,不允許添加重復元素,其實現類主要有HashSet(底層基於HashTable)、LinkedHashSet(底層基於鏈表)、TreeSet(底層基於樹結構),具體特性如下:
-
- HashSet(基於Hash存儲,查找元素性能優良,應該作為Set實現類的默認選擇)
- LinkedHashSet(具有HashSet查找元素的性能,內部使用鏈表維護元素有序性)
- TreeSet(底層基於樹結構,該接口維護元素的有序性,默認按照自然順序排序,也可以自定義排序規則,元素必須實現Comparable接口)
Queue
Queue是典型的先進先出(FIFO)容器,主要有LinkedList(基於鏈表)和Priority(優先級隊列),具體特性如下:
-
- PriorityQueue(優先級隊列,可定義排列順序)
Map
Map是基於鍵值對的數據結構,可以用鍵來查找值,標準的Java類庫中包含了Map的幾種實現,包括:HashMap、TreeMap、LinkedHashMap、WeakHashMap、ConcurrentHashMap、IdentityHashMap,各自實現類的行為特性各不相同,主要表現在效率、鍵值對的保存及呈現次序、對象的保存周期、映射表如何在多線程程序中工作和判定“鍵”的等價等策略方面。
-
-
HashMap(基於Hash存儲,查找元素性能優良,應該作為Map實現類的默認選擇)
-
TreeMap(底層基於樹結構,該接口維護元素的有序性,默認按照自然順序排序,也可以自定義排序規則,元素必須實現Comparable接口)
-
LinkedHashMap(具有HashSet查找元素的性能,內部使用鏈表維護元素有序性)
-
HashMap是使用hashCode()進行快速查詢的,此方法能夠顯著提升性能。
-
集合元素比較
如前所述,日常開發的許多場景都需要維護元素的有序性,對於Integer、String等基本類型可以采用默認自然排序,但對於對象排序,為了實現對象間的大小比較,通常采用實現Comparable接口和自定義比較器並實現Comparator接口2種方式,詳細用法如下:
-
- 實現Comparable接口
采用這種方式非常接單,只要實現compareTo(T o)方法即可。
public int compareTo(T o);
-
- 自定義比較器並實現Comparator接口
int compare(T o1, T o2);
compareTo(T o)方法和compare(T o1,T o2)方法實現需要定義與目標對象的比較規則,方法返回0表示兩對象相等;返回小於0表示當前對象小於目標對象;返回大於0表示大於目標對象。
-
- Comparable接口和Comparator接口應用案例
- Comparable接口和Comparator接口應用案例
-
Collection與Collections區別
java.util.Collection 是一個集合接口。它提供了對集合對象進行基本操作的通用接口方法。Collection接口在Java 類庫中有很多具體的實現。Collection接口的意義是為各種具體的集合提供了最大化的統一操作方式。
java.util.Collections 是一個包裝類。它包含有各種有關集合操作的靜態多態方法。此類不能實例化,就像一個工具類,服務於Java的Collection框架,Collection與Collectins看起來很像,其實有本質的區別,使用過程中要謹慎對待。
-
完整的容器分析方法
此圖羅列了完整的集合框架圖 ,日常開發掌握以上的容器實現類足夠了,特定的類查閱官網API即可。
-
具體實現類源碼分析
本文僅僅從宏觀角度去分析了Java標準類庫中集合框架常用接口及其實現類,具體更為細節的源碼分析,將以系列文章的形式呈現,具體鏈接如下:
-
- ArrayList源碼分析
集合容器概覽