1. 程式人生 > >Java容器類源碼解析前言之集合框架結構

Java容器類源碼解析前言之集合框架結構

集合框架 底層 函數 treemap類 value 繼承 查詢 ima p s

一、基本概念

Java容器類庫的用途是“保存對象”,容器庫類分為兩個不同的分支。

1.Collection。可以保存一個或多個對象,將其保存為一個序列。Collection又可以細分為List(表),Set(集)和Queue(隊列)。List按照插入順序保存對象,從索引0開始為每一個插入的對象分配一個索引。Set與List類似,但與List不同的是Set中不能有相同的對象。Queue對象產生的順序通常與元素的插入順序相同,一般按照先進先出的規則來刪除與訪問元素。

2.Map。Map(映射表)使用二維數組來保存一組或多組成對的“Key—Value”(鍵值對)對象,一個Key對應一個Value,你可以用key來查找它所對應的value。與Collection不同的是,Collection使用索引數來來查找索引數對應的對象,而Map使用鍵對象來查找值對象,其實現了鍵對象與值對象的映射關系。

二、集合類的框架結構

技術分享圖片

圖 1 集合框架中類的繼承關系

集合框架中類自上而下的的繼承關系如上圖,分別為實現了Collection接口的AbstractCollect類和實現了Map接口的AbstractMap類兩大分支。其中較為常用的類有實現了List接口的ArrayList與linkedList類,實現了Set接口的HashSet、TreeSet、LinkedHashSet類,實現了Queue接口的PrioretyQueue類,實現了Map接口的HashMap、LinkedHashMap、TreeMap類等。

(註:這裏沒有給出類的具體接口實現關系,有關類的具體接口實現關系在後面源碼分析的博文中補充)

1.ArrayList。ArrayList是一個可以動態增長和縮減的索引序列,其中的元素是未排序的,可以有重復元素。查找元素(指get(int index)方法)的的時間復雜度為O(1),插入和刪除元素的時間復雜度為O(n)。查找元素比LinkedList高效,但是插入和刪除元素與LinkedList相比較慢。

2.LinkedList。LinkedList是一個可以在任何位置快速高效的地插入和刪除元素的雙向鏈表,其中的的元素未排序,可以有重復元素。查找元素的時間復雜度為O(n),插入和刪除元素的時間復雜度為O(1)。與ArrayList比,查找元素較慢,插入和刪除元素較為高效。LinkedList還可以用來實現棧,隊列,以及雙端隊列。

3.HashMap。HashMap是一種儲存鍵值對的數據結構,其中的元素未排序,鍵對象不能重復,值對象可以重復。HashMap其底層數據結構為散列表(數組+鏈表),若散列函數均勻散列,裝填因子合理,查找元素的時間復雜度為O(1),插入和刪除的時間復雜度也均為O(1)。若散列表中的某個桶儲存的鏈表長度大於8時,該鏈表將轉化為紅黑樹,這個桶中元素的查詢、插入和刪除的時間復雜度將都變為O(log n),n為該桶中的元素個數。

4.LinkedHashMap。也是一種儲存鍵值對的映射表,與HashMap不同的是,LinkedHashMap還使用了雙向鏈表來儲存元素的插入順序。

5.TreeMap。TreeMap是一種對插入的鍵值對自動有序排列的映射表。其中的鍵對象已排序,鍵對象不能重復,值對象可以重復,插入TreeMap的鍵對象要實現Comparable或Comparator接口具有排序功能。底層數據結構為紅黑樹,查詢、插入和刪除的時間復雜度為O(log n),效率均低於HashMap()。

6.HashSet。HashSet是一個不能插入重復元素的集合。其中的元素未排序,沒有重復元素。通過閱讀源碼可知,HashSet是通過HashMap實現的,其查找、插入和刪除的時間復雜度也均為O(1)。

7.LinkedHashSet。其中的元素未排序,沒有重復元素。LinkedHashSet與HashSet不同的是,LinkedHashSet是通過LinkedHashMap實現,所以LinkedHashSet也儲存了元素的插入順序。

8.TreeSet。TreeSet是一個沒有重復元素的能夠對插入元素自動排序的集合。其中的元素已排序,沒有重復元素。通過源碼可知,HashSet是通過TreeMap實現,所以插入TreeSet的對象要實現Comparable或Comparator接口具有排序功能。底層數據結構為紅黑樹,查詢、插入和刪除的時間復雜度為O(log n),效率均低於HashSet()。

9.PriorityQueue。PriorityQueue是一種可以高效查詢其中最小的元素的集合,底層數據結構為最小堆,沒有重復元素。查詢最小元素的時間復雜度為O(1),查詢其他元素的時間復雜度為O(n),插入和刪除的時間復雜度為O(log n)。

(註:以上集合類均不是線程安全的)

(小官原創,若有錯誤,望各位前輩批評指正)

Java容器類源碼解析前言之集合框架結構