List、Set、Map三者之間的關系

1、數據結構與核心特性

接口數據結構順序性唯一性鍵值對null 元素
List動態數組/鏈表有序(插入順序)允許重復允許多個 null
Set哈希表 / 紅黑樹無序(HashSet)有序(LinkedHashSet/TreeSet)不允許重復僅 HashSet/LinkedHashSet 允許 1 個 null
Map哈希表 / 紅黑樹 鏈表長度≥8 時轉紅黑樹無序(HashMap)有序(LinkedHashMap/TreeMap)鍵(Key)唯一鍵:HashMap 允許 1 個 null值

2、實現類對比

List

  • ArrayList:基于動態數組,隨機訪問快(O (1)),插入 / 刪除慢(O (n))。
  • LinkedList:基于雙向鏈表,插入 / 刪除快(O (1)),隨機訪問慢(O (n))。
  • Vector:線程安全(同步方法),性能低于 ArrayList。
    Set
  • HashSet:基于 HashMap,無序,依賴hashCode()和equals()。
  • LinkedHashSet:繼承 HashSet,維護插入順序(或訪問順序)。
  • TreeSet:基于 TreeMap,有序(自然排序或自定義 Comparator),不允許 null。
    Map
  • HashMap:線程不安全,允許 null 鍵 / 值,無序。
  • LinkedHashMap:繼承 HashMap,維護插入順序(或訪問順序)。
  • TreeMap:基于紅黑樹,按鍵排序(自然排序或自定義 Comparator),不允許 null 鍵。
  • ConcurrentHashMap:線程安全(分段鎖 / CAS),高并發場景優先選擇。
  • Hashtable:線程安全(同步方法),不允許 null 鍵 / 值,性能低。

3、線程安全性

  • List:ArrayList/LinkedList 非線程安全,Vector/CopyOnWriteArrayList 線程安全。
  • Set:HashSet/TreeSet 非線程安全,CopyOnWriteArraySet/ConcurrentSkipListSet 線程安全。
  • Map:HashMap/TreeMap 非線程安全,ConcurrentHashMap/Hashtable 線程安全。

4、適用場景

  • List:需要有序、可重復數據,頻繁隨機訪問(如分頁查詢結果)。
  • Set:需要去重、無需順序(如權限去重),或需要有序且唯一(如排行榜)。
  • Map:需要鍵值對映射(如配置緩存),或需要按鍵排序(如時間軸數據)。

5、性能優化

  • 初始容量:創建集合時預估大小,避免頻繁擴容(如new ArrayList<>(100))。
  • HashMap 加載因子:默認 0.75,高并發場景可調整以平衡空間和時間。
  • TreeSet/TreeMap:插入 / 刪除 / 查詢時間復雜度 O (log n),適用于需要排序的場景。

6、常見坑點

  • Set 去重依賴方法:自定義對象需重寫hashCode()和equals()。
  • Map 的鍵不可變:使用自定義對象作為鍵時,確保其不可變(如 String、Integer)。
  • ConcurrentHashMap 迭代器弱一致性:迭代時不拋出ConcurrentModificationException,但可能反映部分修改。

7、源碼層面理解

  • ArrayList 擴容機制:每次擴容為原容量的 1.5 倍(oldCapacity + (oldCapacity >> 1))。
  • HashMap哈希沖突處理:鏈表 + 紅黑樹(JDK 8+,鏈表長度≥8 且容量≥64 時轉換為樹)。
  • TreeSet 排序實現:基于 TreeMap 的NavigableMap接口,通過compareTo()或Comparator排序

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

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

相關文章

進程控制----進程終止

一、進程終止的核心場景正常終止&#xff08;代碼完整運行完畢&#xff09;成功&#xff1a;進程執行到main函數結束或調用exit()&#xff0c;返回退出碼 0&#xff08;約定為執行成功&#xff09;。失敗&#xff1a;代碼執行完畢但結果異常&#xff0c;返回非零退出碼&#xf…

Milvus docker-compose 部署

文章目錄 前言Milvus docker-compose 部署1. 下載2. 修改配置3. 啟動4. 測試 前言 如果您覺得有用的話&#xff0c;記得給博主點個贊&#xff0c;評論&#xff0c;收藏一鍵三連啊&#xff0c;寫作不易啊^ _ ^。 ??而且聽說點贊的人每天的運氣都不會太差&#xff0c;實在白嫖的…

EveryThing搜索具體路徑下文件中的內容

1.打開EveryThing 2.點擊搜索&#xff0c;選擇高級搜索 3.選擇需要搜索的文件的路徑以及文件中需要包含的內容 4.之后就可以搜索到對應的目標文件

【算法】寬度優先遍歷BFS

二叉樹的寬搜 429、N叉樹的層序遍歷 題解 BFS核心思想 二叉樹的寬搜一般都是借助隊列來實現的&#xff0c;實現的原理為首先將根節點進行放入隊列中&#xff0c;然后將根節點進行彈出的時候&#xff0c;將這個節點的孩子節點進行放入隊列中&#xff0c;然后繼續彈出隊頭的元…

【STM32】通用定時器基本原理

STM32 通用定時器基本原理&#xff08;基于 STM32F1&#xff09;參考資料&#xff1a;STM32F1xx官方資料&#xff1a;《STM32中文參考手冊V10》-第14章通用定時器STM32 定時器分類 STM32F103 系列共有三類定時器&#xff1a;&#x1f50e; 通用定時器&#xff08;TIM2~TIM5&…

【Go語言-Day 14】深入解析 map:創建、增刪改查與“鍵是否存在”的奧秘

Langchain系列文章目錄 01-玩轉LangChain&#xff1a;從模型調用到Prompt模板與輸出解析的完整指南 02-玩轉 LangChain Memory 模塊&#xff1a;四種記憶類型詳解及應用場景全覆蓋 03-全面掌握 LangChain&#xff1a;從核心鏈條構建到動態任務分配的實戰指南 04-玩轉 LangChai…

Vue腳手架搭建項目+基礎知識

1. 使用腳手架創建項目1.1 準備工作winR&#xff0c;在彈出的數據框中輸入cmd&#xff0c;數據命令查看node以及npm版本 下載vue cli1.2 創建項目1.2.1 創建一個英文目錄文件夾&#xff0c;cmd打開命令命令提示符1.2.2 vue ui命令打開控制臺1.2.3 創建項目創建成功1.3 項目結構…

微信小程序下單頁—地址列表頁—新增地址頁 頁面交互

新增地址流程&#xff1a; 下單頁 → 地址列表頁 (1次跳轉)地址列表頁 → 新增地址頁 (1次跳轉)保存地址 → 返回地址列表頁 (1次返回&#xff0c;自動刷新列表) 選擇地址流程&#xff1a; 地址列表頁 → 選中地址 → 返回下單頁 (1次返回) 更換地址&#xff1a; 下單頁 → 地址…

JVM與JMM

為了更清晰地對比JVM和JMM&#xff0c;我們可以采用表格形式&#xff0c;從定義、功能、結構、與多線程關系等方面進行詳細比較&#xff1a; 對比項JVM&#xff08;Java Virtual Machine&#xff09;JMM&#xff08;Java Memory Model&#xff09;定義一種虛構的計算機&#x…

【Docker基礎】Docker數據卷管理:docker volume rm及其參數詳解

目錄 1 引言&#xff1a;Docker Volume 的生命周期管理 2 docker volume rm命令基礎 2.1 命令作用 2.2 命令語法 3 參數深度解析 3.1 基礎參數表 3.2 高級參數詳解 3.2.1 --force&#xff08;-f&#xff09; 4 Volume刪除前置條件 4.1 可刪除狀態判斷 4.2 常見報錯處…

嵌入式系統內核鏡像相關(十)

文章目錄 前言一、點亮多個led燈的基礎實驗以及其中的問題1.1 基礎流程1.1.1 alinx教程的問題1.1.1.1 驅動程序中的亮/滅邏輯修改&#xff01;1.1.1.1.1 邏輯錯誤的修改1.1.1.1.2 多燈亮/滅 1.1.1.2 驅動程序中引腳的問題以及與裸機開發的區別&#xff08;重要&#xff09;1.1.…

Word和Excel批量轉PDF新方法,操作簡單

PDF是一種跨平臺的文檔格式&#xff0c;無論在任何設備上查看&#xff0c;其排版、字體和圖像都不會發生變化。這確保了文檔的一致性&#xff0c;避免了由于不同軟件版本或操作系統引起的顯示問題。這款小巧的工具大小不到2MB&#xff0c;使用起來異常簡單。只需要把需要轉換的…

AI搜索 MCP最佳實踐

背景 那些 LLM 不知道的事 嘗試直接詢問LLM“今天天氣如何”時&#xff0c;會發現LLM無法回答——它既不知道“今天”是哪天&#xff0c;也無法獲取地理位置信息。這揭示了LLM的局限&#xff1a;缺乏與外部工具和實時數據的交互能力。 為解決這一問題&#xff0c;MCP&#x…

JVM 簡介與作用

&#x1f680; JVM 簡介與作用 &#x1f4da; 深入理解 Java 虛擬機的核心概念與重要作用 &#x1f4d6; 目錄 &#x1f914; 什么是 Java 虛擬機&#xff08;JVM&#xff09;&#x1f310; JVM 在 Java 生態中的核心地位&#x1f500; JVM 跨平臺原理剖析&#x1f4dd; 總結 …

? OpenAudio S1:影視級文本轉語音與語音克隆Mac整合包

? OpenAudio S1&#xff1a;影視級文本轉語音與語音克隆Mac整合包 &#x1f680; OpenAudio S1 簡介 OpenAudio S1 是由 Fish Audio 開發的 Fish Speech 系列的最新一代人工智能語音生成模型。該模型旨在大幅提升 AI 語音生成的技術水平&#xff0c;為用戶提供更加自然、富有表…

spring加載外部properties文件屬性時,讀取到userName變量值和properties文件的值不一致

問題 使用spring DI注入外部properties文件屬性時&#xff0c;讀取到userName變量值和properties文件的值不一致。 bean屬性注入&#xff1a; <!--加載配置文件--> <context:property-placeholder location"classpath:*.properties"/><bean id"…

黑馬點評系列問題之基礎篇p7 06初識redis無法在虛擬機查到圖形化界面存進去的鍵

問題描述 在RESP中輸入了一些鍵(name,age等這些) 但是在圖形化界面里面輸入的&#xff0c;在非圖形化界面就找不到&#xff0c;在非圖形化界面里輸入的&#xff0c;在圖形化界面里就可以查到。 原因分析及解決 經過多次實驗&#xff0c;發現是因為在添加鍵名的時候&#xff0…

在VMware虛擬機中安裝Windows 98時,Explorer提示“該程序執行了非法操作,即將關閉”的解決辦法

在使用iso文件&#xff08;MD5: 0E496B5DCC519F550AAF0BCFBB4A11EA&#xff09;安裝Windows98時&#xff0c;遇到此提示。 雖然原因未知&#xff0c;也無需深入探究&#xff0c;但是根據網友在 https://www.bilibili.com/opus/435866522585702782 中給出的相似經驗&#xff…

在瀏覽器中使用SQLite(官方sqlite3.wasm)

有人可能會問&#xff1a;既然瀏覽器里又內置得IndexedDB&#xff0c;而且在IndexedDB里存數據&#xff0c;關了瀏覽器數據也不會丟&#xff0c;為什么還要在瀏覽器里用SQLite? 實際上&#xff0c;當 IndexedDB 內的數據量增多&#xff0c;數據和數據之間的關系變得復雜&…

數據結構(Java)--位運算

前言 本文為本小白學習數據結構的筆記&#xff0c;將以算法題為導向&#xff0c;向大家更清晰的介紹數據結構相關知識&#xff08;算法題都出自B站馬士兵教育——左老師的課程&#xff0c;講的很好&#xff0c;對于想入門刷題的人很有幫助&#xff09; 為什么要使用為位運算 位…