Java集合框架的內部揭秘:List、Set與Map的深潛之旅

Java集合框架是一套強大的工具,為開發者提供了靈活的數據管理方式。本文將深入剖析List、Set和Map的內部機制,通過詳細的示例和擴展討論,帶你領略這些數據容器的真諦。

一、List:有序序列的深度剖析

List接口是一個可以包含重復元素的有序集合。Java中,ArrayListLinkedList是最常見的List實現。

  • ArrayList:基于動態數組,支持隨機訪問,但插入和刪除效率較低。
import java.util.ArrayList;public class ArrayListExample {public static void main(String[] args) {ArrayList<Integer> numbers = new ArrayList<>();numbers.add(1);numbers.add(2);System.out.println(numbers.get(0)); // 輸出 1System.out.println(numbers.size()); // 輸出 2// 插入和刪除操作numbers.add(1, 3);System.out.println(numbers); // 輸出 [1, 3, 2]numbers.remove(1);System.out.println(numbers); // 輸出 [1, 2]}
}
  • LinkedList:基于鏈表,適合頻繁的插入和刪除,但不支持隨機訪問。
import java.util.LinkedList;public class LinkedListExample {public static void main(String[] args) {LinkedList<Integer> numbers = new LinkedList<>();numbers.add(1);numbers.add(2);System.out.println(numbers.getFirst()); // 輸出 1System.out.println(numbers.getLast()); // 輸出 2// 插入和刪除操作numbers.addFirst(0);System.out.println(numbers); // 輸出 [0, 1, 2]numbers.removeLast();System.out.println(numbers); // 輸出 [0, 1]}
}
二、Set:唯一元素的守護者

Set接口確保集合中元素的唯一性,不支持重復元素。主要實現包括HashSetTreeSet

  • HashSet:基于哈希表,提供快速的元素查找和插入。
import java.util.HashSet;public class HashSetExample {public static void main(String[] args) {HashSet<Integer> numbers = new HashSet<>();numbers.add(1);numbers.add(2);numbers.add(2); // 重復元素不會被添加System.out.println(numbers.contains(1)); // 輸出 trueSystem.out.println(numbers.size()); // 輸出 2}
}
  • TreeSet:基于紅黑樹,自動排序元素,適用于需要有序集合的場景。
import java.util.TreeSet;public class TreeSetExample {public static void main(String[] args) {TreeSet<Integer> numbers = new TreeSet<>();numbers.add(2);numbers.add(1);numbers.add(3);System.out.println(numbers); // 輸出 [1, 2, 3]}
}
三、Map:鍵值對的管理大師

Map接口用于存儲鍵值對,鍵必須是唯一的。HashMapTreeMap是最常見的Map實現。

  • HashMap:基于哈希表,提供快速的鍵值對查找。
import java.util.HashMap;public class HashMapExample {public static void main(String[] args) {HashMap<Integer, String> map = new HashMap<>();map.put(1, "One");map.put(2, "Two");System.out.println(map.get(1)); // 輸出 OneSystem.out.println(map.containsKey(2)); // 輸出 true}
}
  • TreeMap:基于紅黑樹,鍵值對自動排序,適用于需要排序的鍵值對場景。
import java.util.TreeMap;public class TreeMapExample {public static void main(String[] args) {TreeMap<Integer, String> map = new TreeMap<>();map.put(2, "Two");map.put(1, "One");map.put(3, "Three");System.out.println(map); // 輸出 {1=One, 2=Two, 3=Three}}
}
擴展討論:迭代器與增強for循環

迭代器(Iterator)和增強for循環(Enhanced For Loop)是遍歷集合的常用方式。

import java.util.ArrayList;
import java.util.Iterator;public class IteratorExample {public static void main(String[] args) {ArrayList<Integer> numbers = new ArrayList<>();numbers.add(1);numbers.add(2);numbers.add(3);// 使用迭代器遍歷Iterator<Integer> iterator = numbers.iterator();while (iterator.hasNext()) {System.out.println(iterator.next());}// 使用增強for循環遍歷for (Integer number : numbers) {System.out.println(number);}}
}
四、深入探討:性能與場景的權衡
  • 性能考量ArrayListHashMap在大多數情況下提供最佳性能,因為它們基于哈希表和數組,而LinkedListTreeSet/TreeMap則在特定場景下表現更佳,如頻繁的插入刪除或需要排序的場合。
  • 內存消耗LinkedList由于額外的節點指針,比ArrayList占用更多內存;TreeSetTreeMap也因為樹的結構而消耗更多內存。
  • 并發安全性:默認情況下,上述容器都不支持線程安全,但在高并發場景下,可以考慮使用Collections.synchronizedList()Collections.synchronizedSet()Collections.synchronizedMap(),或者ConcurrentHashMap等并發容器。

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

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

相關文章

自制連點器

B站使用教程&#xff1a;https://www.bilibili.com/video/BV1SR85e4EKw/?vd_source47eba1800d831e86d4778a128740fe73 下載鏈接&#xff1a;鏈接&#xff1a;https://pan.baidu.com/s/1Spv_yVPFB3zoS__VL-nhaQ?pwdyxo1 提取碼&#xff1a;yxo1

20.x86游戲實戰-遠線程注入的實現

免責聲明&#xff1a;內容僅供學習參考&#xff0c;請合法利用知識&#xff0c;禁止進行違法犯罪活動&#xff01; 本次游戲沒法給 內容參考于&#xff1a;微塵網絡安全 工具下載&#xff1a; 鏈接&#xff1a;https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…

Spring Boot 中,監聽應用程序啟動的生命周期事件的4種方法

文章目錄 前言在 Spring Boot 中&#xff0c;監聽應用程序啟動的生命周期事件有多種方法。你可以使用以下幾種方式來實現&#xff1a; 一、使用 ApplicationListener二、使用 EventListener三、實現 CommandLineRunner 或 ApplicationRunner四、使用 SmartLifecycle總結 前言 …

Spring AI 應用開發中設置訪問 Ollama 的超時時間

使用 Spring AI 開發 AI 應用時&#xff0c;Ollama 通常在本地開發和測試時使用&#xff0c;用來在本地運行大模型。由于本地開發機器的資源限制&#xff0c;當使用 Ollama 運行較大的模型時&#xff0c;大模型給出響應的時間會比較長。Spring AI 提供的 OllamaChatModel 與 Ol…

在Mac上免費恢復誤刪除的Word文檔

Microsoft Word for Mac是一個有用的文字處理應用程序&#xff0c;它與Microsoft Office套件捆綁在一起。該軟件的穩定版本包括 Word 2019、2016、2011 等。 Word for Mac 與 Apple Pages 兼容;這允許在不同的操作系統版本中使用Word文檔&#xff0c;而不會遇到任何麻煩。 與…

【數據結構】非線性表----樹詳解

樹是一種非線性結構&#xff0c;它是由**n&#xff08;n>0&#xff09;**個有限結點組成一個具有層次關系的集合。具有層次關系則說明它的結構不再是線性表那樣一對一&#xff0c;而是一對多的關系&#xff1b;隨著層數的增加&#xff0c;每一層的元素個數也在不斷變化&…

逆向案例二十三——請求頭參數加密,某區塊鏈交易逆向

網址&#xff1a;aHR0cHM6Ly93d3cub2tsaW5rLmNvbS96aC1oYW5zL2J0Yy90eC1saXN0L3BhZ2UvNAo 抓包分析&#xff0c;發現請求頭有X-Apikey參數加密&#xff0c;其他表單和返回內容沒有加密。 直接搜索關鍵字&#xff0c;X-Apikey&#xff0c;找到疑似加密位置&#xff0c;注意這里…

零基礎學習Python(三)

1. 多重繼承 一個子類可以繼承多個父類&#xff0c;這與一些編程語言的規則不通。 如果多個父類中有同名的變量和方法&#xff0c;子類訪問的順序是按照繼承時小括號里書寫的順序進行訪問的。 可以用issubclass(B, A)方法判斷B是否為A的子類。 2. 綁定 類中的方法通過參數s…

《TF2.x強化學習手冊》P59-P65-SARSA-Q-learning

文章目錄 實現SARSA算法和對應的強化學習智能體前期準備實現步驟工作原理初始化算法流程 構建基于Q學習的智能體前期準備實現步驟工作原理SARSA 算法的收斂性&#xff1a;SARSA 適合在線學習和真實系統&#xff1a;Q 學習算法的適用性&#xff1a; 實現SARSA算法和對應的強化學…

HDC使用常見命令

HDC&#xff08;HarmonyOS Device Connector&#xff09;是為開發人員提供的用于調試的命令行工具&#xff0c;通過該工具可以在windows/linux/mac系統上與真實設備進行交互。 使用HDC前&#xff0c;需要配置相關環境變量&#xff1a; 在此電腦 > 屬性 > 高級系統設置 &g…

Git常用命令以及使用IDEA集成Gitee

目錄 一、設置用戶簽名 二、初始化本地庫 三、查看本地庫狀態 四、添加文件到暫存區 五、提交本地庫 六、修改文件 七、版本穿梭 八、Git分支 九、分支的操作 9.1、查看分支 9.2、創建分支 9.3、切換分支 9.4、合并分支 十、團隊協作 十一、Idea集成Git 11.1、配…

Github 2024-07-15 開源項目周報 Top15

根據Github Trendings的統計,本周(2024-07-15統計)共有15個項目上榜。根據開發語言中項目的數量,匯總情況如下: 開發語言項目數量Python項目5非開發語言項目4JavaScript項目3TypeScript項目2Go項目1Solidity項目1Java項目1Rust項目1免費編程學習平臺:freeCodeCamp.org 創建…

3.1-RNN存在的問題以及LSTM的結構

文章目錄 1 RNN存在的問題1.1梯度消失問題1.2梯度爆炸問題1.3梯度爆炸的對策 2梯度消失的對策——LSTM2.1輸出門2.2遺忘門2.3輸入門2.4總結2.5 LSTM梯度的流動 1 RNN存在的問題 RNN存在梯度消失和梯度爆炸的問題。 書上以下圖的這句話為例&#xff0c;進行說明&#xff1b;為了…

前瞻斷言與后瞻斷言:JavaScript 正則表達式的秘密武器

JavaScript 中的前瞻斷言&#xff08;lookahead&#xff09;和后瞻斷言&#xff08;lookbehind&#xff09;相信用過的小伙伴就知道它的威力了&#xff0c;在一些特定的需求場景下&#xff0c;可以做到四兩撥千斤的作用&#xff0c;今天讓我們來盤點一下在 JavaScript 正則表達…

昇思25天學習打卡營第14天|munger85

基于MindNLPMusicGen生成自己的個性化音樂 這個所謂的個性化的音樂就是指你輸入一段文字它會根據這個文字輸出一段音樂這個音樂是貼近于那段文字的所以叫做文生成音樂&#xff0c; 如果網絡正常的話就可以直接從下載這個模型。 那么音樂生成的有兩種方式呢有兩種方式&#xff…

【C++初階】C/C++內存管理

【C初階】C/C內存管理 &#x1f955;個人主頁&#xff1a;開敲&#x1f349; &#x1f525;所屬專欄&#xff1a;C&#x1f96d; &#x1f33c;文章目錄&#x1f33c; 1. C/C內存分布 2. C語言中動態內存管理方式&#xff1a;malloc/calloc/realloc/free 3. C內存管理方式 3…

DP學習——組合模式

學而時習之&#xff0c;溫故而知新。 組合模式 和代理模式相比 和代理模式相比&#xff0c;有點類似。引用類和被引用類都繼承于同一個接口類。 但是感覺組合模式是對代理模式的更加豐富化&#xff08;升級版、超進化&#xff09;&#xff0c;集合化或者說聚合化。 組合模…

拉格朗日乘子法和KKT條件

拉格朗日乘子法(Lagrange Multiplier) 和 KKT(Karush-Kuhn-Tucker) 條件是求解約束優化問題的重要方法&#xff0c;在有等式約束時使用拉格朗日乘子法&#xff0c;在有不等約束時使用 KKT 條件。當然&#xff0c;這兩個方法求得的結果只是必要條件&#xff0c;只有當目標函數…

ssrf復習(及ctfshow351-360)

1. SSRF 概述 服務器會根據用戶提交的URL發送一個HTTP請求。使用用戶指定的URL&#xff0c;Web應用可以獲取圖片或者文件資源等。典型的例子是百度識圖功能。 如果沒有對用戶提交URL和遠端服務器所返回的信息做合適的驗證或過濾&#xff0c;就有可能存在“請求偽造"的缺陷…

C#中錯誤與異常處理

1、錯誤和異常 如果程序運行期間發生錯誤&#xff0c;異常就會發生。異常會中止當前的程序流&#xff0c;如果不采取措施&#xff0c;程序將停止運行。 錯誤和異常是兩個不同的概念&#xff0c;但它們都與程序的穩定性和可維護性有關。 1.1、錯誤 錯誤通常是指編譯時的語法錯誤…