Java進階總結——集合

Java進階總結——集合

在這里插入圖片描述

說明:對于以上的框架圖有如下幾點說明

1.所有集合類都位于java.util包下。Java的集合類主要由兩個接口派生而出:Collection和Map,Collection和Map是Java集合框架的根接口,這兩個接口又包含了一些子接口或實現類。

集合接口:6個接口(短虛線表示),表示不同集合類型,是集合框架的基礎。
抽象類:5個抽象類(長虛線表示),對集合接口的部分實現。可擴展為自定義集合類。
實現類:8個實現類(實線表示),對接口的具體實現。
Collection 接口是一組允許重復的對象。
Set 接口繼承 Collection,集合元素不重復。
List 接口繼承 Collection,允許重復,維護元素插入順序。
Map接口是鍵-值對象,與Collection接口沒有什么關系。
9.Set、List和Map可以看做集合的三大類:
List集合是有序集合,集合中的元素可以重復,訪問集合中的元素可以根據元素的索引來訪問。
Set集合是無序集合,集合中的元素不可以重復,訪問集合中的元素只能根據元素本身來訪問(也是集合里元素不允許重復的原因)。
Map集合中保存Key-value對形式的元素,訪問時只能根據每項元素的key來訪問其value。

二 總體分析

看上面的框架圖,先抓住它的主干,即Collection和Map。我們在業務代碼中用的最多的也是基于這兩種接口類型實現的具體集合類。同時在每個接口以及實現類中我們也實現了相應的迭代器以便遍歷集合中的元素。
1.Collection是一個接口,包含了集合的基本屬性和操作,對應的實現類有list和set兩大分支。
其中List是一個有序隊列,允許重復元素的存在。其實現有linkedlist,linkedHashList等;
set是一個不允許有重復元素存在的集合,其實現有hashset和treeset,hshset依賴于hshmap。
2.Map是一個映射接口,即key-value鍵值對。Map中的每一個元素包含“一個key”和“key對應的value”。AbstractMap是個抽象類,它實現了Map接口中的大部分API。而HashMap,TreeMap,WeakHashMap都是繼承于AbstractMap。Hashtable雖然繼承于Dictionary,但它實現了Map接口。
3.再看Iterator。它是遍歷集合的工具,即我們通常通過Iterator迭代器來遍歷集合。我們說Collection依賴于Iterator,是因為Collection的實現類都要實現iterator()函數,返回一個Iterator對象。ListIterator是專門為遍歷List而存在的。

三 Collection接口

1.List接口
List集合代表一個有序集合,集合中每個元素都有其對應的順序索引。List集合允許使用重復元素,可以通過索引來訪問指定位置的集合元素。實現List接口的集合主要有:ArrayList、LinkedList、Vector、Stack。

(1)ArrayList
ArrayList是一個動態數組,也是我們最常用的集合。它允許任何符合規則的元素插入甚至包括null。每一個ArrayList都有一個初始容量10,該容量代表了數組的大小。隨著容器中的元素不斷增加,容器的大小也會隨著增加。在每次向容器中增加元素的同時都會進行容量檢查,當快溢出時,就會進行擴容操作。所以如果我們明確所插入元素的多少,最好指定一個初始容量值,避免過多的進行擴容操作而浪費時間、效率。
ArrayList擅長于隨機訪問。同時ArrayList是非同步的。

(2)LinkedList
同樣實現List接口的LinkedList與ArrayList不同,ArrayList是一個動態數組,而LinkedList是一個雙向鏈表。所以它除了有ArrayList的基本操作方法外還額外提供了get,remove,insert方法在LinkedList的首部或尾部。
由于實現的方式不同,LinkedList不能隨機訪問,它所有的操作都是要按照雙重鏈表的需要執行。在列表中索引的操作將從開頭或結尾遍歷列表(從靠近指定索引的一端)。這樣做的好處就是可以通過較低的代價在List中進行插入和刪除操作。
與ArrayList一樣,LinkedList也是非同步的。如果多個線程同時訪問一個List,則必須自己實現訪問同步。

(3)Vector
與ArrayList相似,但是Vector是同步的。所以說Vector是線程安全的動態數組。它的操作與ArrayList幾乎一樣。

(4)Stack
Stack繼承自Vector,實現一個后進先出的堆棧。Stack提供5個額外的方法使得Vector得以被當作堆棧使用。基本的push和pop 方法,還有peek方法得到棧頂的元素,empty方法測試堆棧是否為空,search方法檢測一個元素在堆棧中的位置。Stack剛創建后是空棧。

2.Set接口
Set是一種不包括重復元素的Collection。它維持它自己的內部排序,所以隨機訪問沒有任何意義。與List一樣,它同樣允許null的存在但是僅有一個。由于Set接口的特殊性,所有傳入Set集合中的元素都必須不同,同時要注意任何可變對象,如果在對集合中元素進行操作時,導致e1.equals(e2)==true,則必定會產生某些問題。Set接口有三個具體實現類,分別是散列集HashSet、鏈式散列集LinkedHashSet和樹形集TreeSet。
Set是一種不包含重復的元素的Collection,無序,即任意的兩個元素e1和e2都有e1.equals(e2)=false,Set最多有一個null元素。需要注意的是:雖然Set中元素沒有順序,但是元素在set中的位置是由該元素的HashCode決定的,其具體位置其實是固定的。

(1)HashSet
HashSet 是一個沒有重復元素的集合。它是由HashMap實現的,不保證元素的順序(這里所說的沒有順序是指:元素插入的順序與輸出的順序不一致),而且HashSet允許使用null 元素。HashSet是非同步的,如果多個線程同時訪問一個哈希set,而其中至少一個線程修改了該set,那么它必須保持外部同步。 HashSet按Hash算法來存儲集合的元素,因此具有很好的存取和查找性能。
HashSet的實現方式大致如下,通過一個HashMap存儲元素,元素是存放在HashMap的Key中,而Value統一使用一個Object對象。
HashSet使用和理解中容易出現的誤區:
a.HashSet中存放null值
HashSet中是允許存入null值的,但是在HashSet中僅僅能夠存入一個null值。
b.HashSet中存儲元素的位置是固定的
HashSet中存儲的元素的是無序的,這個沒什么好說的,但是由于HashSet底層是基于Hash算法實現的,使用了hashcode,所以HashSet中相應的元素的位置是固定的。
c.必須小心操作可變對象(Mutable Object)。如果一個Set中的可變元素改變了自身狀態導致Object.equals(Object)=true將導致一些問題。

(2)LinkedHashSet
LinkedHashSet繼承自HashSet,其底層是基于LinkedHashMap來實現的,有序,非同步。LinkedHashSet集合同樣是根據元素的hashCode值來決定元素的存儲位置,但是它同時使用鏈表維護元素的次序。這樣使得元素看起來像是以插入順序保存的,也就是說,當遍歷該集合時候,LinkedHashSet將會以元素的添加順序訪問集合的元素。

(3)TreeSet
TreeSet是一個有序集合,其底層是基于TreeMap實現的,非線程安全。TreeSet可以確保集合元素處于排序狀態。TreeSet支持兩種排序方式,自然排序和定制排序,其中自然排序為默認的排序方式。當我們構造TreeSet時,若使用不帶參數的構造函數,則TreeSet的使用自然比較器;若用戶需要使用自定義的比較器,則需要使用帶比較器的參數。
注意:TreeSet集合不是通過hashcode和equals函數來比較元素的.它是通過compare或者comparaeTo函數來判斷元素是否相等.compare函數通過判斷兩個對象的id,相同的id判斷為重復元素,不會被加入到集合中。

四、Map接口
Map與List、Set接口不同,它是由一系列鍵值對組成的集合,提供了key到Value的映射。同時它也沒有繼承Collection。在Map中它保證了key與value之間的一一對應關系。也就是說一個key對應一個value,所以它不能存在相同的key值,當然value值可以相同。

1.HashMap
以哈希表數據結構實現,查找對象時通過哈希函數計算其位置,它是為快速查詢而設計的,其內部定義了一個hash表數組(Entry[] table),元素會通過哈希轉換函數將元素的哈希地址轉換成數組中存放的索引,如果有沖突,則使用散列鏈表的形式將所有相同哈希地址的元素串起來,可能通過查看HashMap.Entry的源碼它是一個單鏈表結構。

2.LinkedHashMap
LinkedHashMap是HashMap的一個子類,它保留插入的順序,如果需要輸出的順序和輸入時的相同,那么就選用LinkedHashMap。
LinkedHashMap是Map接口的哈希表和鏈接列表實現,具有可預知的迭代順序。此實現提供所有可選的映射操作,并允許使用null值和null鍵。此類不保證映射的順序,特別是它不保證該順序恒久不變。
LinkedHashMap實現與HashMap的不同之處在于,后者維護著一個運行于所有條目的雙重鏈接列表。此鏈接列表定義了迭代順序,該迭代順序可以是插入順序或者是訪問順序。
根據鏈表中元素的順序可以分為:按插入順序的鏈表,和按訪問順序(調用get方法)的鏈表。默認是按插入順序排序,如果指定按訪問順序排序,那么調用get方法后,會將這次訪問的元素移至鏈表尾部,不斷訪問可以形成按訪問順序排序的鏈表。
注意,此實現不是同步的。如果多個線程同時訪問鏈接的哈希映射,而其中至少一個線程從結構上修改了該映射,則它必須保持外部同步。
由于LinkedHashMap需要維護元素的插入順序,因此性能略低于HashMap的性能,但在迭代訪問Map里的全部元素時將有很好的性能,因為它以鏈表來維護內部順序。

3.TreeMap
TreeMap 是一個有序的key-value集合,非同步,基于紅黑樹(Red-Black tree)實現,每一個key-value節點作為紅黑樹的一個節點。TreeMap存儲時會進行排序的,會根據key來對key-value鍵值對進行排序,其中排序方式也是分為兩種,一種是自然排序,一種是定制排序,具體取決于使用的構造方法。

自然排序:TreeMap中所有的key必須實現Comparable接口,并且所有的key都應該是同一個類的對象,否則會報ClassCastException異常。

定制排序:定義TreeMap時,創建一個comparator對象,該對象對所有的treeMap中所有的key值進行排序,采用定制排序的時候不需要TreeMap中所有的key必須實現Comparable接口。

TreeMap判斷兩個元素相等的標準:兩個key通過compareTo()方法返回0,則認為這兩個key相等。

如果使用自定義的類來作為TreeMap中的key值,且想讓TreeMap能夠良好的工作,則必須重寫自定義類中的equals()方法,TreeMap中判斷相等的標準是:兩個key通過equals()方法返回為true,并且通過compareTo()方法比較應該返回為0。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/67977.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/67977.shtml
英文地址,請注明出處:http://en.pswp.cn/web/67977.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

計算機視覺和圖像處理

計算機視覺與圖像處理的最新進展 隨著人工智能技術的飛速發展,計算機視覺和圖像處理作為其中的重要分支,正逐步成為推動科技進步和產業升級的關鍵力量。 一、計算機視覺的最新進展 計算機視覺,作為人工智能的重要分支,主要研究如…

3.PPT:華老師-計算機基礎課程【3】

目錄 NO12? NO34? NO56? NO789? NO12 根據考生文件夾下的Word文檔“PPT素材.docx”中提供的內容在PPT.pptx中生成初始的6張幻燈片 新建幻燈片6張→ctrlc復制→ctrlv粘貼開始→新建幻燈片→幻燈片(從大綱)→Word文檔注?前提是:Word文檔必須應用標題1、標題2…

(三)QT——信號與槽機制——計數器程序

目錄 前言 信號(Signal)與槽(Slot)的定義 一、系統自帶的信號和槽 二、自定義信號和槽 三、信號和槽的擴展 四、Lambda 表達式 總結 前言 信號與槽機制是 Qt 中的一種重要的通信機制,用于不同對象之間的事件響…

藍橋杯備賽題目練習(一)

一. 口算練習題 ## 題目描述 王老師正在教簡單算術運算。細心的王老師收集了 i 道學生經常做錯的口算題,并且想整理編寫成一份練習。 編排這些題目是一件繁瑣的事情,為此他想用計算機程序來提高工作效率。王老師希望盡量減少輸入的工作量,比…

深入探討:服務器如何響應前端請求及后端如何查看前端提交的數據

深入探討:服務器如何響應前端請求及后端如何查看前端提交的數據 一、服務器如何響應前端請求 前端與后端的交互主要通過 HTTP 協議實現。以下是詳細步驟: 1. 前端發起 HTTP 請求 GET 請求:用于從服務器獲取數據。POST 請求:用…

毫秒級響應的VoIP中的系統組合推薦

在高并發、低延遲、毫秒級響應的 VoIP 場景中,選擇合適的操作系統組合至關重要。以下是針對 Ubuntu linux-lowlatency、CentOS Stream kernel-rt 和 Debian 自定義 PREEMPT_RT 的詳細對比及推薦: 1. 系統組合對比 特性Ubuntu linux-lowlatencyCentO…

【LeetCode 刷題】回溯算法(4)-排列問題

此博客為《代碼隨想錄》二叉樹章節的學習筆記,主要內容為回溯算法排列問題相關的題目解析。 文章目錄 46.全排列47.全排列 II 46.全排列 題目鏈接 class Solution:def permute(self, nums: List[int]) -> List[List[int]]:res, path [], []used [0] * len(n…

基于多智能體強化學習的醫療AI中RAG系統程序架構優化研究

一、引言 1.1 研究背景與意義 在數智化醫療飛速發展的當下,醫療人工智能(AI)已成為提升醫療服務質量、優化醫療流程以及推動醫學研究進步的關鍵力量。醫療 AI 借助機器學習、深度學習等先進技術,能夠處理和分析海量的醫療數據,從而輔助醫生進行疾病診斷、制定治療方案以…

深度學習篇---張量數據流動處理

文章目錄 前言第一部分:張量張量的基本概念1.維度標量(0維)向量(1維)矩陣(2維)三維張量 2.形狀 張量運算1.基本運算加法減法乘法除法 2.廣播3.變形4.轉置5.切片6.拼接7.矩陣分解8.梯度運算&…

Redis --- 秒殺優化方案(阻塞隊列+基于Stream流的消息隊列)

下面是我們的秒殺流程: 對于正常的秒殺處理,我們需要多次查詢數據庫,會給數據庫造成相當大的壓力,這個時候我們需要加入緩存,進而緩解數據庫壓力。 在上面的圖示中,我們可以將一條流水線的任務拆成兩條流水…

使用 Ollama 和 Kibana 在本地為 RAG 測試 DeepSeek R1

作者:來自 Elastic Dave Erickson 及 Jakob Reiter 每個人都在談論 DeepSeek R1,這是中國對沖基金 High-Flyer 的新大型語言模型。現在他們推出了一款功能強大、具有開放權重的思想鏈推理 LLM,這則新聞充滿了對行業意味著什么的猜測。對于那些…

2025年大年初一篇,C#調用GPU并行計算推薦

C#調用GPU庫的主要目的是利用GPU的并行計算能力,加速計算密集型任務,提高程序性能,支持大規模數據處理,優化資源利用,滿足特定應用場景的需求,并提升用戶體驗。在需要處理大量并行數據或進行復雜計算的場景…

Unity 2D實戰小游戲開發跳跳鳥 - 計分邏輯開發

上文對障礙物的碰撞邏輯進行了開發,接下來就是進行跳跳鳥成功穿越過障礙物進行計分的邏輯開發,同時將對應的分數以UI的形式顯示告訴玩家。 計分邏輯 在跳跳鳥通過障礙物的一瞬間就進行一次計分,計分后會同步更新分數的UI顯示來告知玩家當前獲得的分數。 首先我們創建一個用…

langchain基礎(二)

一、輸出解析器(Output Parser) 作用:(1)讓模型按照指定的格式輸出; (2)解析模型輸出,提取所需的信息 1、逗號分隔列表 CommaSeparatedListOutputParser:…

游戲AI,讓AI 玩游戲有什么作用?

讓 AI 玩游戲這件事遠比我們想象的要早得多。追溯到 1948 年,圖靈和同事錢伯恩共同設計了國際象棋程序 Turochamp。之所以設計這么個程序,圖靈是想說明,機器理論上能模擬人腦能做的任何事情,包括下棋這樣復雜的智力活動。 可惜的是…

鴻蒙物流項目之基礎結構

目錄: 1、項目結構2、三種包的區別和使用場景3、靜態資源的導入4、顏色樣式設置5、修改項目名稱和圖標6、靜態包基礎目錄7、組件的抽離8、在功能模塊包里面引用靜態資源包的組件 1、項目結構 2、三種包的區別和使用場景 3、靜態資源的導入 放在har包中,那…

Cursor 與多語言開發:全棧開發的利器

引言 全棧開發要求開發者跨越前端、后端、數據庫甚至數據科學等多個技術領域,而不同技術棧往往需要切換工具和思維方式。Cursor 作為一款 AI 驅動的智能編程助手,憑借其對 20 編程語言 和主流框架的深度支持,正在成為全棧開發的“瑞士軍刀”…

算法設計-0-1背包動態規劃(C++)

一、問題闡述 0-1 背包問題的目標是在給定背包容量 W 的情況下&#xff0c;從 n 個物品中選擇一些物品放入背包&#xff0c;使得背包中物品的總價值最大。每個物品只能選擇一次&#xff08;即要么放入背包&#xff0c;要么不放入&#xff09;。 二、代碼 #include <iostr…

51c視覺~CV~合集10

我自己的原文哦~ https://blog.51cto.com/whaosoft/13241694 一、CV創建自定義圖像濾鏡 熱圖濾鏡 這組濾鏡提供了各種不同的藝術和風格化光學圖像捕捉方法。例如&#xff0c;熱濾鏡會將圖像轉換為“熱圖”&#xff0c;而卡通濾鏡則提供生動的圖像&#xff0c;這些圖像看起來…

全棧開發:使用.NET Core WebAPI構建前后端分離的核心技巧(二)

目錄 配置系統集成 分層項目使用 篩選器的使用 中間件的使用 配置系統集成 在.net core WebAPI前后端分離開發中&#xff0c;配置系統的設計和集成是至關重要的一部分&#xff0c;尤其是在管理不同環境下的配置數據時&#xff0c;配置系統需要能夠靈活、可擴展&#xff0c…