首頁 Java java教程 Java集合:Set、List、Queue、Map四個系統的歸納總結

Java集合:Set、List、Queue、Map四個系統的歸納總結

Aug 08, 2018 am 10:51 AM
java集合

Java集合大致分為Set、List、Queue、Map四個系統 

其中Set代表無序、不可重複的集合;List代表有序、重複集合;Map代表具有映射關係的集合;Queue是隊列的實作。

集合和陣列不一樣,陣列元素既可以是基本類型的值,也可以是物件(實際上保存的是物件的參考變數),集合裡面只能保存物件(實際上只是保存對象的引用變數)。

Java集合中有兩個衍生的介面:Collection 和Map
#Collection集合系統的繼承樹:

Java集合:Set、List、Queue、Map四個系統的歸納總結 Map集合系統的繼承樹:
Java集合:Set、List、Queue、Map四個系統的歸納總結

下面分別講述
#Set集合:
Set集合類似一個罐子,程式可以依序將多個物件「丟進」裡面,Set不會記得元素的新增順序,Set集合不允許有相同的元素。

HashSet:
特點:
無法保證元素的排列順序
HashSet不是同步的
集合元素值可以為null
HashSet判斷兩個元素相等的標準是:兩個物件透過equals()方法比較相等,且兩個物件的hashcode()方法傳回值也相等。
注意:當把一個物件放進HashSet中時,如果需要重寫該物件的equals()方法,則應該重寫其hashCode()方法。規則是:如果兩個物件透過equals()方法比較回傳true,則兩個物件的hashCode值應該相同。

LinkedSet:
LinkedSet根據原始的hashCode的值來決定元素的儲存位置,但是他同時使用鍊錶維護元素的順序,這樣使得元素的插入的順序保存。 LinkedSet會依照元素的新增順序來存取集合裡的元素。
LinkedSet需要維護元素的插入位置,因此效能會略低於HashSet的效能。

TreeSet:
TreeSet可以確保集合元素處於排序狀態。
TreeSet並不是根據元素的插入順序進行排序的,而是根據元素的實際值的大小來進行排序的。
TreeSet採用紅黑樹的資料結構來儲存集合元素。
TreeSet支援兩種排序方法:自然排序和自訂排序。在預設情況下,TreeSet採用自然排序。

自然排序:TreeSet會呼叫集合元素的compareTo(Object obj)方法來比較元素之間的大小關係,然後將集合元素按升序排列。在預設情況下,TreeSet採用自然排序。
當物件加入TreeSet集合時,TreeSet呼叫該物件的compareTo(Object obj)方法與容器中的其他物件比較大小,然後根據紅黑樹結構找到它的儲存位置。
判斷兩個物件是否相等的唯一標準是:兩個物件透過compareTo(Object obj)方法比較是否回傳0。
如果兩個物件透過equals()方法比較傳回true時,這兩個物件透過compareTo(Object obj)方法比較應傳回0。

自訂排序:如果需要實作客製化排序,則需要在建立TreeSet集合物件時,提供一個Comparator物件與該TreeSet集合關聯,並由該Comparator物件負責集合元素的排序邏輯。

EnumSet:
EnumSet的集合元素也是有順序的,EnumSet以列舉值在Enum類別內部的定位順序來決定集合元素的順序。
EnumSet內部以位元向量的形式儲存。
EnumSet集合不允許加入null元素。

各Set實現類別的效能分析:
HashSet的效能總比TreeSet好,因為TreeSet需要額外的紅黑樹演算法來維護集合的順序。
LinkedSet對於普通的插入、刪除操作,LinkedSet比HashSet要稍微慢一些,這是由維護鍊錶所帶來的額外開銷所造成的。但是由於有鍊錶,遍歷LinkedSet比較快。
EnumSet效能最好,但只能保存同一個枚舉類別得枚舉值作為集合元素。

List:
List代表一個元素有序,可重複的結合,集合中的每個元素都有對應的順序索引。
List集合可以根據位置索引來存取集合中的元素,因此List可以使用for迴圈來遍歷。

ArrayList、LinkedList與Vector
ArrayList原始碼分析:
LinkedList原始碼分析:

Queue:
Queue用於模擬隊列這種資料結構。
PriorityQueue:
PriorityQueue保存隊列元素的順序並不是按照加入的順序,而是按照隊列元素的大小進行排序的。
PriorityQueue不允許插入null元素。

Deque:
Deque介面是Queue介面的子接口,它代表一個雙端佇列。
當程式中需要使用「堆疊」這種資料結構時,建議使用ArrayDeque。

各種線性表的效能分析:
1.如果需要遍歷List集合元素,對ArrayList、Vector集合,應該使用隨機存取方法(get)來遍歷集合元素,以便效能更好;對於LinkedList集合應該使用迭代器(Iterator)來遍歷集合元素。
2.如果需要經常執行插入、刪除,應使用LinkedList。
3.如果多執行緒同時存取List集合中的元素,應該使用Collections將集合包裝成執行緒安全的集合。

Map:
Map的key不允許重複,即同一個Map物件的任何兩個key透過equals方法比較總是回傳false。
Map中存在一個keySet()方法,用來傳回Map中所有key組成的Set集合。

HashMap、Hashtable:
HashMap與Hashtable的差別:
1.Hashtable是一個執行緒安全的Map,HashMap是非執行緒安全的,所以HashMap的效能比較好。
2.Hashtable不允許使用null作為key和value,HashMap允許使用null作為key或value。

Hashtable、HashMap判斷兩個key相等的標準是:兩個的key的equals()方法回傳true,兩個key的HashCode值相同;判斷兩個value相等的標準是value的equals( )方法傳回值相同。

LinkedMap:
LinkedMap會記住key-value的新增順序。

TreeMap:
TreeMap也是採用了紅黑樹的結構,TreeMap中判斷兩個key相等的標準是:
兩個key透過compareTo()方法的傳回值為0.(在自然排序下)
兩個key透過compareTo()方法的傳回值為0.同時equals()方法比較傳回為true。 (定制排序下)。

EnumMap:
EnumMap內部以陣列的形式保存。
EnumMap不允許使用null當key,但允許value為null。

Map的效能分析:
HashMap的效能比Hashtable的效能好。
TreeMap中的key-value對總是處於有序狀態,無須進行專門的排序操作。
對於一般的運用場景,多考慮使用HashMap。
LinkedMap要比HashMap慢,是因為需要維護鍊錶來保持key-value的新增順序。
EnumMap的效能最好,但只能使用同一個枚舉類別的枚舉值作為key。

相關推薦:

Java集合Set、List、Map的遍歷方法

一段程式碼搞清楚關於Java中List、Set集合及Map的使用

#

以上是Java集合:Set、List、Queue、Map四個系統的歸納總結的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Java的類負載機制如何起作用,包括不同的類載荷及其委託模型? Java的類負載機制如何起作用,包括不同的類載荷及其委託模型? Mar 17, 2025 pm 05:35 PM

Java的類上載涉及使用帶有引導,擴展程序和應用程序類負載器的分層系統加載,鏈接和初始化類。父代授權模型確保首先加載核心類別,從而影響自定義類LOA

如何使用咖啡因或Guava Cache等庫在Java應用程序中實現多層緩存? 如何使用咖啡因或Guava Cache等庫在Java應用程序中實現多層緩存? Mar 17, 2025 pm 05:44 PM

本文討論了使用咖啡因和Guava緩存在Java中實施多層緩存以提高應用程序性能。它涵蓋設置,集成和績效優勢,以及配置和驅逐政策管理最佳PRA

如何將JPA(Java持久性API)用於具有高級功能(例如緩存和懶惰加載)的對象相關映射? 如何將JPA(Java持久性API)用於具有高級功能(例如緩存和懶惰加載)的對象相關映射? Mar 17, 2025 pm 05:43 PM

本文討論了使用JPA進行對象相關映射,並具有高級功能,例如緩存和懶惰加載。它涵蓋了設置,實體映射和優化性能的最佳實踐,同時突出潛在的陷阱。[159個字符]

如何將Maven或Gradle用於高級Java項目管理,構建自動化和依賴性解決方案? 如何將Maven或Gradle用於高級Java項目管理,構建自動化和依賴性解決方案? Mar 17, 2025 pm 05:46 PM

本文討論了使用Maven和Gradle進行Java項目管理,構建自動化和依賴性解決方案,以比較其方法和優化策略。

如何使用適當的版本控制和依賴項管理創建和使用自定義Java庫(JAR文件)? 如何使用適當的版本控制和依賴項管理創建和使用自定義Java庫(JAR文件)? Mar 17, 2025 pm 05:45 PM

本文使用Maven和Gradle之類的工具討論了具有適當的版本控制和依賴關係管理的自定義Java庫(JAR文件)的創建和使用。

See all articles