0X JavaSE-- 集合框架【Collection(List、Set、Queue)、Map】

  • 每一個集合類底層采用的數據結構不同,例如ArrayList集合底層采用了數組,LinkedList集合底層采用了雙向鏈表,HashMap集合底層采用了哈希表,TreeMap集合底層采用了紅黑樹。
  • **集合中存儲的是引用。**即。集合中存放的是對象的地址,而不是把堆中的實例對象存儲。
  • 默認情況下,如果不使用泛型的話,集合中可以存儲任何類型的引用,只要是 Object 的子類都可以存儲。
  • Java集合框架相關的類都在 java.util 包下。
  • Java 集合框架有兩大支線:
    • Collection,可進一步細分為
      • List:可重復的集合。具體實現有: ArrayList(動態數組)LinkedList(雙向鏈表)
      • Set:不可重復的集合,典型代表就是 HashSet(哈希表)TreeSet(紅黑樹)
      • Queue:隊列。具體實現有:雙端隊列 ArrayDeque,以及優先級隊列 PriorityQueue
    • Map:鍵值對的集合。具體實現有: HashMapLinkedHashMap(雙向鏈表 + 哈希表)
  • 這些具體實現中,只有 TreeSet、LinkedHashMap 是有序的(鍵有序

Collection

1、List

List 的特點是存取有序,可以存放重復的元素,可以用下標對元素進行操作。

1.1 ArrayList

  • ArrayList 是由數組實現的,支持隨機存取,也就是可以通過下標直接存取元素;
  • 從尾部插入和刪除元素會比較快捷,從中間插入和刪除元素會比較低效,這是由數組的特點決定的;
  • 如果內部數組的容量不足時會自動擴容,因此當元素非常龐大的時候,效率會比較低。

1.2 LinkedList

  • LinkedList 是由雙向鏈表實現的,不支持隨機存取,只能從一端開始遍歷,直到找到需要的元素后返回;
  • 任意位置插入和刪除元素都很方便,因為只需要改變前一個節點和后一個節點的引用即可,不像 ArrayList 那樣需要復制和移動數組元素,這是由鏈表的特點決定的;
  • 因為每個元素都存儲了前一個和后一個節點的引用,所以相對來說,占用的內存空間會比 ArrayList 多一些。
// CRUD 實例
// 創建一個集合
LinkedList<String> list = new LinkedList<String>();
// 添加元素
list.add("apple");
list.add("avocado");// 遍歷集合 for 循環
for (int i = 0; i < list.size(); i++) {String s = list.get(i);System.out.println(s);
}
// 遍歷集合 for each
for (String s : list) {System.out.println(s);
}// 刪除元素
list.remove(1);
// 遍歷集合
for (String s : list) {System.out.println(s);
}// 修改元素
list.set(1, "apricot");

1.3 ArrayList 和 LinkedList

1.4 Vector 和 Stack

List 的實現類還有一個 Vector,是一個元老級的類,比 ArrayList 出現得更早。

ArrayList 和 Vector 非常相似,只不過 Vector 是線程安全的,像 get、set、add 這些方法都加了 synchronized 關鍵字,就導致執行效率會比較低,所以現在已經很少用了。
這種加了同步方法的類,注定會被淘汰掉,就像StringBuilder 取代 StringBuffer那樣。

Stack 是 Vector 的一個子類,本質上也是由動態數組實現的,只不過還實現了先進后出的功能(在 get、set、add 方法的基礎上追加了 pop「返回并移除棧頂的元素」、peek「只返回棧頂元素」等方法),所以叫棧。
由于 Stack 執行效率比較低(方法上同樣加了 synchronized 關鍵字),就被雙端隊列 ArrayDeque 取代了(下面會介紹)。

2、Set

3、Queue

3.1 ArrayDeque

ArrayDeque 是一個基于數組實現的雙端隊列,為了滿足可以同時在數組兩端插入或刪除元素的需求,數組必須是循環的,也就是說數組的任何一點都可以被看作是起點或者終點。

3.2 LinkedList

LinkedList 一般應該歸在 List 下,只不過,它也實現了 Deque 接口,可以作為隊列來使用。

實際上,LinkedList 同時實現了 Stack、Queue、PriorityQueue 的所有功能。

// 演示 LinkedList 的隊列特性
LinkedList<String> queue = new LinkedList<>();// 區別于 add, offer元素用于向隊尾添加元素
queue.offer("apple");
queue.offer("avocado");
System.out.println(queue); // 輸出 [apple, avocado]// 刪除元素
queue.poll();
System.out.println(queue); // 輸出 [avocado]// 修改元素:LinkedList 中的元素不支持直接修改,需要先刪除再添加
String first = queue.poll();
queue.offer("apple");
System.out.println(queue); // 輸出 [apple]// 查找元素:既可以查找下標,也可以查找內容
System.out.println(queue.get(0)); // 輸出 apple
System.out.println(queue.contains("apricot")); // 輸出 false// 查找元素:使用迭代器的方式查找陳清揚
// 使用迭代器依次遍歷元素并查找
Iterator<String> iterator = queue.iterator();
while (iterator.hasNext()) {String element = iterator.next();if (element.equals("apple")) {System.out.println("找到了:" + element);break;}
}
3.2.1 add–remove / offer–poll

LinkedList 同時實現了 List 和 Deque(雙端隊列)接口,因此,其同時擁有兩組插入/刪除的方法:

  • add–remove:List 接口中定義的方法
    • 在 LinkedList 實例的尾部進行插入和刪除
  • offer–poll:Deque 接口中定義的方法
    • 在 LinkedList 實例的尾部進行插入,頭部進行刪除(即隊列的特征)

3.3 ArrayDeque 和 LinkedList

LinkedList 和 ArrayDeque 都是 Java 集合框架中的雙向隊列(deque),它們都支持在隊列的兩端進行元素的插入和刪除操作。

不過,LinkedList 和 ArrayDeque 在實現上有一些不同:

  • 底層實現方式不同:LinkedList 是基于鏈表實現的,而 ArrayDeque 是基于數組實現的。
  • 隨機訪問的效率不同:由于底層實現方式的不同,LinkedList 對于隨機訪問的效率較低,時間復雜度為 O(n),而 ArrayDeque 可以通過下標隨機訪問元素,時間復雜度為 O(1)。
  • 迭代器的效率不同:LinkedList 對于迭代器的效率比較低,因為需要通過鏈表進行遍歷,時間復雜度為 O(n),而 ArrayDeque 的迭代器效率比較高,因為可以直接訪問數組中的元素,時間復雜度為 O(1)。
  • 內存占用不同:由于 LinkedList 是基于鏈表實現的,它在存儲元素時需要額外的空間來存儲鏈表節點,因此內存占用相對較高,而 ArrayDeque 是基于數組實現的,內存占用相對較低。
  • 如何選擇?
    • 如果需要在雙向隊列的兩端進行頻繁的插入和刪除操作,并且需要隨機訪問元素,可以考慮使用 ArrayDeque;
    • 如果需要在隊列中間進行頻繁的插入和刪除操作,可以考慮使用 LinkedList。‘

3.4 PriorityQueue

PriorityQueue 是一種優先級隊列,它的出隊順序與元素的優先級有關,執行 remove 或者 poll 方法,返回的總是優先級最高的元素。


Map

  • Map 保存的是鍵值對,鍵要求保持唯一性,值可以重復。
  • Map 接口的常見實現類有兩個:
    • HashMap
    • TreeMap

1. HashMap

  • HashMap 可以根據快速地查找對應的值——通過哈希函數將鍵映射到哈希表中的一個索引位置,從而實現快速訪問。
  • HashMap 中的鍵和值都可以為 null。如果鍵為 null,則將該鍵映射到哈希表的第一個位置。
  • 可以使用迭代器或者 forEach 方法遍歷 HashMap 中的鍵值對。
  • HashMap 有一個初始容量和一個負載因子。初始容量是指哈希表的初始大小,負載因子是指哈希表在擴容之前可以存儲的鍵值對數量與哈希表大小的比率。默認的初始容量是 16,負載因子是 0.75。
// HashMap 實例
HashMap<String, String> hashMap = new HashMap<>();// 添加鍵值對
hashMap.put("蘋果", "apple");
hashMap.put("牛油果", "avocado");
hashMap.put("香蕉","Banana");// 遍歷 HashMap
for (String key : hashMap.keySet()) {String value = hashMap.get(key);System.out.println(key + " 對應的值為:" + value);
}
// HashMap 中,鍵的順序是根據鍵的哈希碼計算結果來決定的,因此,不保證有序
// 輸出為 蘋果-- 香蕉--牛油果// 獲取指定鍵的值
String value1 = hashMap.get("蘋果");
System.out.println("蘋果對應的值為:" + value1);// 修改鍵對應的值
hashMap.put("蘋果", "apple1");
String value2 = hashMap.get("蘋果");
System.out.println("修改后蘋果對應的值為:" + value2);// 刪除指定鍵的鍵值對
hashMap.remove("牛油果");

2. LinkedHashMap

  • LinkedHashMap 是 HashMap 的子類,。也就是說,只要是 LinkedHashMap ,那么必然也是一個 HashMap。
  • LinkedHashMap 可以看作是 HashMap + LinkedList 的合體。它使用哈希表來存儲數據;使用雙向鏈表來記錄插入/訪問元素的順序,維持順序。
  • 這里的順序,指的是維持插入的順序。
// LinkedHashMap 實例
LinkedHashMap<String, String> linkedHashMap = new LinkedHashMap<>();
linkedHashMap.put("蘋果", "apple");
linkedHashMap.put("牛油果", "avocado");
linkedHashMap.put("香蕉","Banana");// 遍歷 LinkedHashMap
for (String key : linkedHashMap.keySet()) {String value = linkedHashMap.get(key);System.out.println(key + " 對應的值為:" + value);
}
// linkedHashMap 保證順序,輸出為 蘋果--牛油果--香蕉,可對比 HashMap 的無序

3. TreeMap

  • TreeMap 實現了 SortedMap 接口,可以自動將鍵按照自然順序或指定的比較器順序排序,并保證其元素的順序。
  • 內部使用紅黑樹來實現鍵的排序和查找。
  • 這里的順序,指的是以鍵值為依據,按照某種規則排序。
// TreeMap 實例
Map<String, String> treeMap = new TreeMap<>();// 向 TreeMap 中添加鍵值對
treeMap.put("c", "cat");
treeMap.put("a", "apple");
treeMap.put("b", "banana");// 遍歷 TreeMap
for (Map.Entry<String, String> entry : treeMap.entrySet()) {System.out.println(entry.getKey() + ": " + entry.getValue());
}
// 按照默認順序對鍵進行了排序,輸出是 a--b--c// 查找鍵值對
String name = "c";
if (treeMap.containsKey(name)) {System.out.println("找到了 " + name + ": " + treeMap.get(name));// 輸出 c:cat
} // 修改鍵值對
name = "a";
if (treeMap.containsKey(name)) {System.out.println("修改前的 " + name + ": " + treeMap.get(name));// 輸出 a:appletreeMap.put(name, "aovcado");System.out.println("修改后的 " + name + ": " + treeMap.get(name));// 輸出 a:aovcado
} // 刪除鍵值對
name = "b";
if (treeMap.containsKey(name)) {System.out.println("刪除前的 " + name + ": " + treeMap.get(name));treeMap.remove(name);System.out.println("刪除后的 " + name + ": " + treeMap.get(name));// 輸出 b:null
} 

ArrayList

  • ArrayList 和 HashMap,算是最常用的兩個集合框架實現。
  • ArrayList 基于數組實現了 List 接口。
  • Java 原生數組的大小是固定的,但 ArrayList 提供了自動擴容。

LinkedList

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

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

相關文章

springboot報錯:Failed to start bean ‘documentationPluginsBootstrapper‘

項目場景&#xff1a; springboot項目啟動時報錯 問題描述 具體報錯信息&#xff1a; 可能原因分析&#xff1a; 1、SpringFox的版本與Spring Boot的版本不兼容。解決這個問題&#xff0c;你可能需要檢查你正在使用的SpringFox和Spring Boot的版本&#xff0c;確保它們是兼容…

一千題,No.0037(組個最小數)

給定數字 0-9 各若干個。你可以以任意順序排列這些數字&#xff0c;但必須全部使用。目標是使得最后得到的數盡可能小&#xff08;注意 0 不能做首位&#xff09;。例如&#xff1a;給定兩個 0&#xff0c;兩個 1&#xff0c;三個 5&#xff0c;一個 8&#xff0c;我們得到的最…

[AIGC] 使用Flink SQL統計用戶年齡和興趣愛好

Apache Flink是一個具有強大計算能力、高吞吐量、低延遲的分布式計算框架&#xff0c;它支持批計算和流計算。Flink SQL是Flink ecosystem的一部分&#xff0c;是一種對結構化數據進行批和流處理的聲明式語言。本文以一個簡單的實例講解如何使用Flink SQL來統計用戶年齡和興趣愛…

C# 面向對象編程(一)——類 第三篇

總目錄 C# 語法總目錄 系列鏈接 C# 面向對象編程(一) 類 第一篇 C# 面向對象編程(一) 類 第二篇 C# 面向對象編程(一) 類 第三篇 C# 面向對象編程 一 ——類 第三篇 簡介面向對象編程類 第三篇9. 重載運算符10. 分部方法** nameof方法 **** GetType 方法和 typeof方…

【Intro】Heterogeneous Graph Attention Network(HAN)

論文鏈接&#xff1a;https://arxiv.org/pdf/1903.07293 Abstract 異構性和豐富的語義信息給面向異構圖的圖形神經網絡設計帶來了巨大的挑戰。 -> 一種基于分層注意的異構圖神經網絡&#xff0c;包括節點級注意和語義級注意。具體來說&#xff0c;節點級關注旨在學習節點…

GPT4o還沒用上?落后一個月!

文章目錄 一.Share官方網站&#xff1a;以一半的價格享受官網服務1.1 網址1.2 一些介紹和教學實戰&#xff1a;1.3 主界面&#xff08;支持4o)&#xff1a;1.4 GPTS&#xff08;上千個工具箱任你選擇&#xff09;&#xff1a;1.5 快速的文件數據分析&#xff08;以數學建模為例…

一次“yarn Couldn‘t find package“問題的排查

本文記錄一次使用yarn install 時報錯 Couldn’t find package xxxx 問題的排查。 問題描述 問題來自于筆者對一個前端項目進行debug時的yarn install 報錯信息&#xff0c;在一個可以明確代碼沒有問題的項目中&#xff0c;因為切換環境&#xff0c;重新執行yarn install,發現…

qt qcomboBox實現自動檢索功能 通過輸入匹配字符進行篩選

本人做了一個自定義控件SeepedSearch 用于快速檢索匹配的字符的下拉框 方便查找目標 直接上源碼 1. SpeedSerach.h #pragma once #include class QComboBox; class QCompleter; class SpeedSearch : public QWidget { Q_OBJECT public: explicit SpeedSearch(QWidget *paren…

web前端三大主流框架指的是什么

web前端三大主流框架是什么&#xff1f;前端開發師的崗位職責有哪些&#xff1f;這邊整理了相關內容供大家參考了解&#xff0c;請各位小伙伴隨小編一起查閱下面的內容。 web前端三大主流框架 web前端三大主流框架是Angular、React、Vue。 1.Angular Angular原名angularJS誕生…

如何用python做一個貪吃蛇程序?——潯川AI社(VIP)

1 游戲說明: 死亡條件:碰壁、吃自己! 狀態:只有吃了食物才會隨機生成其中一種狀態,分別是:穩如老狗、幸運光滑、衰神附體之一 狀態:穩如老狗:相對于上一次速度不變! 狀態:幸運光滑:相對于上一次速度變慢! 狀態:衰神附體:相對于上一次速度變快! 總體速率對比…

UnityAPI學習之Transform組件基本使用

目錄 Transform組件 訪問與獲取 Transform的位置和旋轉信息 Transform局部坐標和旋轉信息的獲取 Transform的縮放與正方向 縮放&#xff08;Scale&#xff09; 正方向 Transform相關的查找方法 銷毀游戲物體 Transform組件 訪問與獲取 現在創建一個容器放置GrisGO物…

操作系統的分類

Linux類系統的組成 Linux操作系統Linux內核Linux應用 Linux內核是什么&#xff1f; Linux系統內核是構成Linux操作系統核心的部分&#xff0c;它是操作系統中最基礎和關鍵的組件&#xff0c;直接與硬件交互并管理計算機系統的底層資源。以下是Linux內核主要特性和功能的概覽…

一起學習大模型 - langchain里的 PromptTemplate詳細介紹

系列文章目錄 一起學習大模型 - 大模型的交互工具prompt簡介與運用 一起學習大模型 - langchain里的PromptTemplate詳細介紹 一起學習大模型 - langchain里PromptTemplate錯誤排查總結 文章目錄 系列文章目錄前言一、 安裝 LangChain二、 基本用法1. 導入庫并定義模板2. 填充…

API接口通道如何設置?

API接口通道如何設置&#xff1f; 如果分站點的AI接口使用openai&#xff08;站點后臺->系統配置->AI參數配置->AI接口&#xff09;&#xff0c;則需要在超管后臺配置接口通道&#xff0c;其他方式則無需在超管后臺配置接口通道 1、進入超管后臺選擇接口通道&#x…

一鍵批量轉換,高效輕松管理:解鎖不同格式圖片統一處理新體驗,讓圖片管理更高效

在信息爆炸的時代&#xff0c;圖片管理成為了一個不容忽視的問題。我們時常面臨各種格式的圖片文件&#xff0c;不同的格式不僅增加了管理的難度&#xff0c;還可能導致兼容性問題。如何快速高效地管理不同格式的圖片&#xff0c;成為了現代人面臨的一大挑戰。現在&#xff0c;…

網上幫別人開網店賣貨的騙局!

小紅書幫別人開店賣貨的騙局主要涉及到一些不法分子利用小紅書平臺的流量和用戶信任度&#xff0c;通過虛假宣傳、承諾高額利潤等手段&#xff0c;誘騙用戶開店并**所謂的“賺錢機會”。 這些騙局往往以“輕松創業、快速致富”為誘餌&#xff0c;吸引那些對創業充滿熱情但缺乏經…

Redis常用命令——List篇

提到List&#xff0c;我們第一時間想到的就是鏈表。但是在Redis中&#xff0c;List更像是一種雙端隊列&#xff0c;例如C中的deque。它可以快速高效的對頭部和尾部進行插入和刪除操作。本片文章主要對List列表的相關命令進行詳解&#xff0c;希望本篇文章會對你有所幫助。 文章…

MedSegDiff-V2: Diffusion-Based Medical Image Segmentation with Transformer 論文總結

標題&#xff1a;MedSegDiff-V2: Diffusion-Based&#xff08;基于擴散模型&#xff09;Medical Image Segmentation&#xff08;醫學圖像分割&#xff09;with Transformer 論文&#xff08;AAAI&#xff09;&#xff1a;https://ojs.aaai.org/index.php/AAAI/article/view/28…

【避坑全攻略】如何讓私人的LLM擁有一個嗓子——ChatTTS

OpenAI 發布 GPT4o 之后&#xff0c;使得越來越多的人都開始幻想屬于自己的AI“伴侶”&#xff0c;這最讓人驚艷的就是他們出色的TTS技術。而在此之前&#xff0c;主流的開源TTS有 XTTS 2 和 Bark。而近日&#xff0c;一個名為 ChatTTS 文本轉語音項目爆火出圈&#xff0c;引來…

Python中的random.choices詳解

1. 什么是random.choices函數&#xff1f; random.choices是Python標準庫中random模塊提供的一個函數&#xff0c;用于從給定的序列中隨機選擇一個值。這個函數可以用于實現隨機抽樣、按照概率進行選擇等功能。 random.choices(population, weightsNone, *, cum_weightsNone,…