JAVA集合框架概述

參考資料:

1、《Java程序設計經典課堂》 -清華大學出版社

 

Java集合框架概述

1、Java中專門提供一套動態對象數組的操作類——集合框架。

2、集合框架實際上就是對常用數據結構的Java實現。

3、集合框架也可以理解成容器,容器主要指的是List、Map、Set和Queue等抽象數據結構。容器可以存儲多個元素,這些元素通常是Java對象。針對上述抽象數據結構所定義的標準編程接口稱爲集合框架。

4、集合框架主要由一組精心設計的接口、類和隱含在其中的算法所組成,通過它們可以採用集合的方式完成Java對象的存儲、獲取、操作(排序、增刪改查)以及轉換等功能。使用集合框架,可以大大提高變成的效率和質量。

5、此外,還可以在集合框架的基礎上完成入堆棧、隊列和多線程安全訪問等。

 

來看一下JAVA集合框架的簡圖,這樣可以讓我們對Java整個集合框架的體系有一個大致的認知。

 

 

1 Collection接口

Collection接口是所有集合類型的根接口。

Collection接口的定義如下圖所示:

 

 

2 List接口及其實現類

2.1 概述

1、List接口也是Collection接口的子接口,它實現一種順序表的數據結構(有時也稱爲序列)。在數據結構的邏輯結構類型中,它屬於線性結構。

2、放在List集合的所有元素都有一個下標(下標從0開始),可以通過該下標實現隨機訪問集合中的元素。

3、List集合中允許存儲重複的元素。

4、List接口的常用實現類有ArrayList和LinkedList。

 

2.2 List新增的接口方法

1、List接口繼承了Collection接口的方法,還另外定義了一些順序表操作的方法。通過這些方法,可以實現定位訪問、查找、鏈式迭代和範圍查看等。

2、List新增的接口方法如下圖所示:

 

2.3 ArrayList類

1、ArrayList是最常用的實現類,它是通過數組實現的順序表來存儲集合對象,可以通過下標訪問集合元素。

2、ArrayList實現了一個可變長的對象數組,其元素可以動態地添加和刪除。

3、ArrayList的定位訪問時間複雜度是O(1),但它添加和刪除元素開銷較大,時間複雜度爲O(n)。因此,當一個集合要頻繁隨機訪問,則應使用ArrayList。

 

2.3.1 ArrayList類的特點

1、ArrayList通過數組的順序表來存儲集合對象,通過下標可以實現高效的隨機訪問。但是ArrayList在執行添加或刪除元素操作時需要移動大量元素,這就導致它在添加或刪除元素時性能不佳。

2、ArrayList不是線程安全的,若在多線程環境下,需要在外部進行線程同步。

 

2.3.2 ArrayList類的應用場景

1、ArrayList通過數組的順序表來存儲集合對象,通過下標實現高效的隨機訪問。因此適用於大量隨機訪問的場景。

2、ArrayList在執行添加或刪除元素操作時需要移動大量元素,這就導致它在添加或刪除元素時性能不佳,因此不適用要頻繁添加或刪除元素的場景。

 

2.4 LinkedList類

1、LinkedList是以鏈表的形式來存儲集合元素。它除了存儲集合元素外,還需要維護節點之間的關聯信息,因此LinkedList的存儲開銷要比ArrayList大。LinkedList是一種鏈式存儲結構。

2、LinkedList雖然在存儲開銷方面大,但它帶來的好處是LinkedList在刪除和添加元素方面的開銷大大降低,時間複雜度爲0(1)。因此,若一個集合列表要頻繁添加或刪除元素,則應使用LinkedList。

3、由於LinkedList是以鏈表的形式來存儲集合元素,它每次遍歷集合元素時都得從頭結點開始,導致它的訪問效率沒有ArrayList好,其時間複雜度爲O(n)。

 

2.4.1 LinkedList類的特點

1、LinkedList是以鏈表的形式來存儲集合元素,能夠高效地添加或刪除元素。

2、LinkedList每次遍歷元素都得從頭結點開始,導致它的訪問效率較低。

 

2.4.2 LinkedList類應用場景

1、LinkedList是以鏈表的形式來存儲集合元素,能夠高效地添加或刪除元素。因此適用於要頻繁添加或刪除元素的場景。

2、LinkedList每次遍歷元素都得從頭結點開始,導致它的訪問效率較低,因此不適用要經常隨機訪問的場景。

 

2.5 關於List接口實現類的性能

1、當需要執行大量的隨機訪問操作時,應當使用ArrayList。

2、當需要頻繁添加或刪除元素時,應當使用LinkedList。

 

 

3 Set接口及其實現類

3.1 概述

1、Set接口集成Collection接口,它沒有定義新的接口方法。

2、Set接口不允許集合中出現重複元素。

3、Set接口常用的實現類有HashSet,TreeSet、LinkedHashSet。

4、Set接口有幾個常用的實現類,它們的層次關係如下圖所示:

 

3.2 HashSet類和LinkedHashSet類

3.2.1 HashSet類

1、HashSet類是抽象類AbstractSet的子類,HashSet使用哈希方法存儲元素,具有很好的性能,但元素沒有順序。

2、HashSet提供最快的訪問速度。

 

3.2.2 LinkedHashSet類

1、LinkkedHashSet類是HashSet的子類。

2、該類與HashSet的不同之處是:LinkedHashSet以插入順序保存元素,但也通過散列提供了快速訪問的能力。

3、LinkedHashSet維護了一個雙向鏈表,該鏈表定義了元素的插入順序。

 

3.3 SortedSet接口與TreeSet類

3.3.1 SortedSet接口

1、SortedSet接口是有序對象的集合,其中的元素排序規則按照元素的自然順序排列。

2、爲了使得元素有序,要求插入到SortedSet集合中的元素必須是可以互相比較的。

 

3.3.2 TreeSet類

1、TreeSet是SortedSet接口的實現類,它使用紅黑樹存儲元素並排序。

2、它基於元素的值對元素進行排序,因此TreeSet的操作效率沒有HashSet高。

 

3.4 關於Set接口實現類的性能

1、HashSet的性能基本上總是比TreeSet好,特別是在添加和查詢元素時,而這兩個操作也是最重要的操作。

2、TreeSet存在的用途是它可以維持元素的順序。因此,在需要一個排序好的Set集合時,應當使用TreeSet。

3、對於插入操作,LinkedHashSet比HashSet的代價更高,更耗費性能,這是由於LinkedHashSet要維護鏈表帶來的開銷。

 

4 Map接口及其實現類

4.1 概述

1、Map表示一種散列結構的數據結構(也稱爲哈希),該結構的基本思想是根據元素的關鍵字通過哈希函數直接計算出一個值,並將這個值作爲該元素的存儲地址。因此,哈希存儲方法該的優點就是查找速度快,只要給出元素的關鍵字,就可以理解計算出元素的存儲地址。

2、哈希存儲方法只存儲元素的數據,不存儲元素之間的邏輯厝,因此哈希存儲方法經常用於對數據進行快速查找和插入的場合。

3、Map是一個專門用來存儲鍵值對的對象。在Map中存儲的關鍵字和值都要求是對象,而且Map存儲的關鍵字是唯一的,而值可以有重複的。

4、Map接口的常用實現類有HashMap、TreeMap、HashTable類。

5、Map接口常及其實現類的層次關係如下圖所示:

 

4.2 Map的接口方法

 

 

4.3 Map接口的實現類

4.3.1 HashMap類

1、HashMap設計用來快速訪問鍵值對,它裏面的元素是沒有順序的。

2、HashMap不是線程安全的,適用於單線程環境。

3、它允許null作爲鍵,也允許null作爲值。

 

4.3.2 LinkedHashMap類

1、LinkedHashMap是HashMap的子類,它保持鍵的順序與插入的順序一致,但它的訪問性能沒有HashMap效率高。

 

4.3.3 TreeMap類

1、TreeMap保持鍵的有序狀態,TreeMap類中的元素會按照鍵進行排序。

2、需要注意的地方是,如果key本身是自定義的對象,name對象所在的類就需要實現Comparable接口。

 

4.3.4 HashTable

1、HashTable實現了一種哈希表,可以實現HashMap一樣的功能。

2、HashTable是Java早期版本提供的一個存放鍵值對的實現類。現在已不推薦使用。

3、HashTable是線程同步的,可在多線程環境下使用,但它的訪問性能不如HashMap。

4、HashTable不允許鍵鍵爲null,若將null作爲鍵存入HashTable,會報錯。

 

發佈了56 篇原創文章 · 獲贊 25 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章