Java Map雙列集合深度解析:HashMap、LinkedHashMap、TreeMap底層原理與實戰應用

Java Map雙列集合深度解析:HashMap、LinkedHashMap、TreeMap底層原理與實戰應用


一、Map雙列集合概述

1. 核心特點

  • 鍵值對結構:每個元素由鍵(Key)和值(Value)組成。
  • 鍵唯一性:鍵不可重復,值可重復。
  • 鍵值映射:每個鍵對應唯一的值,通過鍵可快速定位值。

2. 常見實現類

實現類特點底層數據結構
HashMap無序、鍵唯一、查詢高效數組+鏈表/紅黑樹(JDK8+)
LinkedHashMap有序(插入/訪問順序)、鍵唯一哈希表+雙向鏈表
TreeMap可排序(自然/自定義)、鍵唯一紅黑樹

二、Map接口核心方法

方法說明
V put(K key, V value)添加鍵值對,返回舊值(若鍵存在)
V remove(Object key)根據鍵刪除鍵值對,返回刪除的值
boolean containsKey(Object)判斷是否包含指定鍵
Set<K> keySet()返回所有鍵的Set集合
Collection<V> values()返回所有值的Collection集合
Set<Entry<K,V>> entrySet()返回所有鍵值對的Entry集合

三、Map遍歷方式詳解

1. 鍵找值遍歷

Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
for (String key : map.keySet()) {System.out.println(key + ":" + map.get(key));
}

2. 鍵值對遍歷(Entry)

for (Map.Entry<String, Integer> entry : map.entrySet()) {System.out.println(entry.getKey() + "=" + entry.getValue());
}

3. Lambda表達式遍歷(JDK8+)

map.forEach((key, value) -> System.out.println(key + "->" + value));

四、核心實現類詳解

1. HashMap

底層原理
  • JDK8前:數組 + 鏈表。
  • JDK8+:數組 + 鏈表 + 紅黑樹(鏈表長度≥8且數組長度≥64時觸發樹化)。
  • 哈希沖突解決:鏈地址法(沖突元素形成鏈表或樹)。
擴容機制
  • 默認初始容量:16。
  • 加載因子:0.75(容量達到75%時擴容為2倍)。
代碼示例
HashMap<String, Integer> hashMap = new HashMap<>();
hashMap.put("Java", 1);
hashMap.put("Python", 2);
System.out.println(hashMap.get("Java")); // 輸出1

2. LinkedHashMap

核心特點
  • 有序性:默認按插入順序,可配置為訪問順序(LRU緩存)。
  • 性能:遍歷效率高于HashMap,但插入和刪除略慢。
代碼示例
LinkedHashMap<String, Integer> linkedMap = new LinkedHashMap<>();
linkedMap.put("First", 1);
linkedMap.put("Second", 2);
// 輸出順序固定為插入順序:First=1, Second=2

3. TreeMap

排序規則
  • 自然排序:鍵需實現Comparable接口。
  • 比較器排序:通過Comparator自定義規則。
代碼示例
// 按字符串長度排序
TreeMap<String, Integer> treeMap = new TreeMap<>((s1, s2) -> s1.length() - s2.length()
);
treeMap.put("Apple", 3);
treeMap.put("Banana", 6);
// 輸出順序:Apple(5) → Banana(6)

五、補充知識點

1. HashMap vs Hashtable

特性HashMapHashtable
線程安全非線程安全線程安全(同步)
Null鍵/值允許不允許
性能更高較低

2. 并發場景下的Map選擇

  • ConcurrentHashMap:分段鎖或CAS(JDK8+),高并發性能優于Hashtable。

3. Properties類

  • 用途:專門處理屬性文件(.properties)。
  • 方法load()讀取文件,store()寫入文件。

4. 紅黑樹特性

  • 自平衡二叉查找樹,確保增刪改查時間復雜度為O(log n)
  • 規則:根節點黑、葉子節點黑、紅節點子節點必黑、任意路徑黑節點數相同。

六、應用場景總結

場景推薦實現類
高頻查詢,無需順序HashMap
需保留插入/訪問順序LinkedHashMap
需鍵排序(自然/自定義)TreeMap
線程安全需求ConcurrentHashMap

七、常見面試題

  1. HashMap如何解決哈希沖突?
    鏈地址法:沖突元素以鏈表或紅黑樹形式存儲。

  2. LinkedHashMap如何實現LRU緩存?
    構造函數設置accessOrder=true,重寫removeEldestEntry()控制淘汰策略。

  3. TreeMap的排序規則如何自定義?
    實現Comparator接口或鍵實現Comparable接口。

  4. HashMap為什么線程不安全?
    多線程擴容可能導致鏈表成環,引發死循環(JDK8已優化,但仍需同步控制)。


關注博主,獲取更多Java集合框架與并發編程深度解析!

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

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

相關文章

HOW - React NextJS 的同構機制

文章目錄 一、什么是 Next.js 的同構&#xff1f;二、核心目錄結構三、關鍵函數&#xff1a;如何實現不同渲染方式&#xff1f;1. getServerSideProps —— 實現 SSR&#xff08;每次請求動態獲取數據&#xff09;2. getStaticProps getStaticPaths —— 實現 SSG&#xff08;…

SkyWalking的工作原理和搭建過程

SkyWalking 是一個開源的 應用性能監控系統&#xff08;APM&#xff09;&#xff0c;專為云原生、微服務架構設計。其核心原理基于 分布式追蹤&#xff08;Distributed Tracing&#xff09;、指標收集&#xff08;Metrics Collection&#xff09; 和 日志關聯&#xff08;Log C…

軟考 系統架構設計師系列知識點之雜項集萃(57)

接前一篇文章&#xff1a;軟考 系統架構設計師系列知識點之雜項集萃&#xff08;56&#xff09; 第93題 美國著名的卡內基梅隆大學軟件工程學研究所針對軟件工程的工程管理能力與水平進行了充分研究&#xff0c;提出了5級管理能力的模式&#xff0c;包括臨時湊合階段、簡單模仿…

Java 泛型與類型擦除:為什么解析對象時能保留泛型信息?

引言&#xff1a;泛型的“魔術”與類型擦除的困境 在 Java 中&#xff0c;泛型為開發者提供了類型安全的集合操作&#xff0c;但其背后的**類型擦除&#xff08;Type Erasure&#xff09;**機制卻常常讓人困惑。你是否遇到過這樣的場景&#xff1f; List<String> list …

【gRPC】HTTP/2協議,HTTP/1.x中線頭阻塞問題由來,及HTTP/2中的解決方案,RPC、Protobuf、HTTP/2 的關系及核心知識點匯總

HTTP/2協議特點 gRPC基于HTTP/2協議&#xff0c;原因&#xff1a; 多路復用&#xff1a;允許在同一個TCP連接上并行傳輸多個請求和響應&#xff0c;即多個gRPC調用可以通過同一個連接同時進行&#xff0c;避免了HTTP/1.x中常見的線頭阻塞問題&#xff0c;減少了連接建立和關閉…

PCIe Switch 問題點

系列文章目錄 文章目錄 系列文章目錄完善PCIe Retimer Overview Document OutlineSwitch 維度BroadComMicroChipAsmedia 祥碩Cyan其他 完善 Functional block diagram&#xff0c;功能框圖Key Features and Benefits&#xff0c;主要功能和優點Fabric 鏈路Multi-root PCIe Re…

vue復雜數據類型多層嵌套的監聽

vue復雜數據類型多層嵌套的監聽 本來看前輩的做法是watch的嵌套&#xff0c;遇到這種復雜的數據結構還是不多&#xff0c;分享一下前輩的做法 let stopChildWatchList [] // 用于存放每個子監聽器watch(() > data,(val) > {// 清除舊監聽stopChildWatchList.forEach(…

來一個復古的技術FTP

背景 10年前的老代碼&#xff0c;需要升級springboot框架&#xff0c;在升級過程中&#xff0c;測試業務流程里&#xff0c;有FTP的下載業務&#xff0c;不管測試環境如何測試&#xff0c;都沒有成功&#xff0c;最后只能自己搭建一個FTP服務器&#xff0c;寫一個ftp-demo來測試…

MyBatis-Flex配置Druid(德魯伊數據庫連接池):Spring Boot 3 集成 MyBatis-Flex 配置 Druid 連接池指南

Spring Boot 3 集成 MyBatis-Flex 配置 Druid 連接池指南 前言 本文詳細講解在 Spring Boot 3 項目中集成 MyBatis-Flex 框架后&#xff0c;如何正確配置 Druid 數據庫連接池。針對開發者常見的配置缺失導致啟動失敗的場景&#xff0c;提供完整的解決方案和原理分析。 前置知識…

安全生產調度管理系統的核心功能模塊

安全生產調度管理系統是運用現代信息技術構建的智能化管理平臺&#xff0c;旨在實現生產安全風險的全面管控和應急資源的優化調度。該系統通過整合物聯網、大數據、人工智能等前沿技術&#xff0c;建立起覆蓋風險監測、預警預測、指揮調度、決策支持的全鏈條安全管理體系。 一…

桃芯ingchips——windows HID鍵盤例程無法同時連接兩個,但是安卓手機可以的問題

目錄 環境 現象 原理及解決辦法 環境 PC&#xff1a;windows11 安卓&#xff1a;Android14 例程使用的是HID Keyboard&#xff0c;板子使用的是91870CQ的開發板&#xff0c;DB870CC1A 現象 連接安卓手機時并不會出現該現象&#xff0c;兩個開發板都可以當做鍵盤給手機發按…

JavaScript - JavaScript 運算符之圓括號運算符與方括號運算符(圓括號運算符概述、圓括號運算符用法、方括號運算符概述、方括號運算符用法)

一、圓括號運算符概述 圓括號運算符&#xff08;()&#xff09;主要用于函數調用、表達式分組、多種語法結構登 二、圓括號運算符用法 調用函數 function greet() {console.log("Hello!"); }greet();# 輸出結果Hello!當箭頭函數有多個參數或零個參數時需要括號 c…

AG-UI 協議:重構多模態交互,開啟智能應用新紀元

一、協議誕生的時代背景&#xff1a;填補 AI 生態最后一塊拼圖 在人工智能技術飛速發展的今天&#xff0c;AI 代理&#xff08;Agent&#xff09;作為能夠主動執行復雜任務的智能實體&#xff0c;正從實驗室走向生產環境&#xff0c;重塑各個行業的工作流程。然而&#xff0c;…

嵌入式學習的第二十天-數據結構-調試+鏈表的一般操作

一、調試 1.一般調試 2.找段錯誤 二、鏈表的一般操作 1.單鏈表的修改 int ModifyLinkList(LinkList*ll,char*name,DATATYPE*data) {DATATYPE * tmp FindLinkList(ll, name);if(NULL tmp){return 1;}memcpy(tmp,data,sizeof(DATATYPE));return 0; } 2.單鏈表的銷毀 int D…

如何同時管理不同平臺的多個賬號?

在當今數字營銷、電商運營、跨境貿易盛行的時代&#xff0c;同時管理多個平臺的賬號幾乎成了從業者的標配。無論是做社媒營銷的廣告主&#xff0c;還是操作亞馬遜、eBay、Shopee 等平臺的跨境賣家&#xff0c;多賬號運營都是提升曝光、分散風險、擴大收益的重要方式。 然而&am…

STM32外設AD/DA-基礎及CubeMX配置

STM32外設AD/DA-基礎及CubeMX配置 一&#xff0c;什么是AD/DA二&#xff0c;基礎概念1&#xff0c;模擬 vs 數字2&#xff0c;AD轉換1&#xff0c;分辨率 (Resolution)2&#xff0c;參考電壓 (Reference Voltage, Vref)3&#xff0c;采樣率 (Sampling Rate) 3&#xff0c;DA轉換…

【軟考 霍夫曼編碼的文檔壓縮比】

霍夫曼編碼的文檔壓縮比計算基于字符頻率的最優編碼分配&#xff0c;以下是詳細步驟及相關案例&#xff1a; 一、壓縮比計算公式 [ \text{壓縮比} \frac{\text{壓縮前總比特數}}{\text{壓縮后總比特數 編碼表存儲開銷}} ] 通常以 比率&#xff08;如 3:1&#xff09; 或 百分…

關閉VSCode 自動更新

參考&#xff1a;關閉VSCode 自動更新_vscode關閉自動更新-CSDN博客 vscode的設置 Update: Mode Update: Enable Windows Background Updates Extensions: Auto Check Updates Extensions: Auto Update

Flask框架搭建

1、安裝Flask 打開終端運行以下命令&#xff1a; pip install Flask 2、創建項目目錄 在Windows上&#xff1a; venv\Scripts\activate 執行 3、創建 app.py 文件 可以在windows終端上創建app.py文件 &#xff08;1&#xff09;終端中創建 使用echo命令 echo "fr…

5G-A和未來6G技術下的操作系統與移動設備變革:云端化與輕量化的發展趨勢

目錄 5G技術帶來的革命性變革 云端化操作系統的實現路徑 完全云端化模式 過渡性解決方案 未來操作系統的發展方向 功能架構演進 安全機制強化 移動設備的形態變革 終端設備輕量化 物聯網設備簡化 實施挑戰與應對策略 技術挑戰 商業模式創新 總結與展望 5G技術作為…