標籤:
Java集合類包位於java.util下,有很多常用的資料結構:數組、鏈表、隊列、棧、雜湊表等等。瞭解不同的集合類的特性在開發過程中是比較重要的,感謝@蘭亭風雨的專欄分析,這裡我也根據自己的理解做輕度的總結,不再進行分析,因為上面的部落格分析已經相當優秀。
List介面實現,一般常用的為ArrayList和LinkedList,還有不太常用的Vector,Stack。比如JDK文檔聲明
Deque 介面及其實現提供了 LIFO 堆棧操作的更完整和更一致的 set,應該優先使用此 set,而非Stack類。例如:
Deque<Integer> stack = new ArrayDeque<Integer>();
對ArrayList和Vector進行一個比較:
- ArrayList非安全執行緒,Vector是安全執行緒的,想要使用安全執行緒的ArrayList類可以Collections.synchronizedList()進行包裹返回安全執行緒的對象,或者使用CopyOnWriteArrayList
- 因為ArrayList和Vector基於數組實現,預設大小為10,所以需要有擴容操作,ArrayList的擴容是1.5倍+1或者所需大小,Vector是2倍
- 都大量使用了Arrays.copyof()和System.arraycopy()進行複製,native方法,擁有數組操作的優點與不足
ArrayList和LinkedList:
- LinkedList基於雙向鏈表實現,按Index訪問時會有一個加速操作,非安全執行緒
- LinkedList還實現了棧和隊列的操作方法,因此也可以作為棧、隊列和雙端隊列來使用
- LinkedList無參構造方法直接建立一個僅包含head節點的空鏈表
- 兩個都允許Null值
Map介面實作類別HashMap和HashTable:
Hash表的解決hash值衝突的常用方法有兩種,一種是拉鏈法也就是每個hash值對應一個鏈表,另一種是線性探測法。
- HashMap和HashTable處理衝突的方式是拉鏈法
- HashMap非安全執行緒,HashTable安全執行緒
- HashMap初始容量是16,載入因子是0.75,擴容後也必須為2的整數次冪;HashTable是12,且不為2的整數次冪
- Hashtable擴容時,將容量變為原來的2倍加1,而HashMap擴容時,將容量變為原來的2倍。
- HashMap可以為Null,HashTable不能為Null
- Hashtable計算hash值,直接用key的hashCode(),而HashMap重新計算了key的hash值Hashtable計算hash值,直接用key的hashCode(),而HashMap重新計算了key的hash值,HashMap中通過h&(length-1)的方法來代替模數,同樣實現了均勻的散列,但效率要高很多,這也是HashMap對Hashtable的一個改進。
TreeMap:
- 基於2-3平衡樹的紅/黑樹狀結構來實現,最下面會對紅/黑樹狀結構做一個簡單的介紹
- TreeMap的key不能為null,排序時要實現Comparable介面,HashMap要求重寫hashCode方法和equals方法來確保沒有重複的key
- TreeMap的查詢、插入、刪除效率均沒有HashMap高,一般只有要對key排序時才使用TreeMap
紅/黑樹狀結構介紹:
紅/黑樹狀結構是一種特殊的2-3平衡樹,它可以保證所有的黑色邊到根節點的距離相等。紅/黑樹狀結構是有序的二叉樹,通過左旋轉、右旋轉、變色等操作,使樹基本保持平衡狀態,防止出現一邊倒的情況,它具有下面的性質:
- 每個節點都只能是紅色或者黑色
- 根節點是黑色
- 每個分葉節點(NIL節點,注nil 節點就是空節點,在紅/黑樹狀結構的實現中,nil 節點代替二叉樹中的NULL)是黑色的。
- 如果一個結點是紅的,則它兩個子節點都是黑的。也就是說在一條路徑上不能出現相鄰的兩個紅色結點。
- 從任一節點到其每個葉子的所有路徑都包含相同數目的黑色節點。
針對Java集合類的小總結