Java中的Map實現類詳解

Java中的Map實現類詳解

Java集合框架提供了多種Map接口的實現,每種實現都有其特定的使用場景和特點。以下是主要的Map實現類及其特性分析:

1. 通用Map實現

HashMap

  • 特點:基于哈希表的實現,允許null鍵和null值
  • 線程安全:非線程安全
  • 性能:O(1)時間復雜度的基本操作(get/put)
  • 排序:不保證順序
  • Java版本:1.2+
  • 典型用途:單線程環境下最常用的Map實現
Map<String, Integer> hashMap = new HashMap<>();

LinkedHashMap

  • 特點:維護插入順序或訪問順序的雙向鏈表
  • 線程安全:非線程安全
  • 性能:比HashMap稍慢,因為要維護鏈表
  • 排序:插入順序或訪問順序(LRU)
  • Java版本:1.4+
  • 典型用途:需要保持插入/訪問順序的場景
// 保持插入順序
Map<String, Integer> linkedMap = new LinkedHashMap<>();// LRU緩存實現(最近最少使用)
Map<String, Integer> lruCache = new LinkedHashMap<>(16, 0.75f, true) {protected boolean removeEldestEntry(Map.Entry eldest) {return size() > MAX_ENTRIES;}
};

TreeMap

  • 特點:基于紅黑樹的NavigableMap實現
  • 線程安全:非線程安全
  • 性能:O(log n)時間復雜度的基本操作
  • 排序:按鍵的自然順序或Comparator排序
  • Java版本:1.2+
  • 典型用途:需要有序映射的場景
// 自然順序
Map<String, Integer> treeMap = new TreeMap<>();// 自定義排序
Map<String, Integer> customOrderMap = new TreeMap<>(Comparator.reverseOrder());

2. 線程安全Map實現

Hashtable

  • 特點:早期的線程安全哈希表實現
  • 線程安全:是(方法級別同步)
  • 性能:較差(同步開銷大)
  • 排序:不保證順序
  • Java版本:1.0+
  • 典型用途:遺留系統維護,新代碼不推薦使用
Map<String, Integer> hashtable = new Hashtable<>();

ConcurrentHashMap

  • 特點:高并發優化的哈希表
  • 線程安全:是(分段鎖/CAS)
  • 性能:高并發下性能優秀
  • 排序:不保證順序
  • Java版本:1.5+
  • 典型用途:高并發環境下的映射需求
Map<String, Integer> concurrentMap = new ConcurrentHashMap<>();

ConcurrentSkipListMap

  • 特點:基于跳表的并發有序Map
  • 線程安全:是
  • 性能:O(log n)時間復雜度
  • 排序:按鍵的自然順序或Comparator排序
  • Java版本:1.6+
  • 典型用途:需要并發訪問的有序映射
ConcurrentMap<String, Integer> skipListMap = new ConcurrentSkipListMap<>();

3. 特殊用途Map實現

EnumMap

  • 特點:專為枚舉鍵設計的高效Map
  • 線程安全:非線程安全
  • 性能:非常高效(基于枚舉序數)
  • 排序:枚舉定義順序
  • Java版本:1.5+
  • 典型用途:使用枚舉作為鍵的映射
enum Day { MON, TUE, WED }
Map<Day, String> enumMap = new EnumMap<>(Day.class);

IdentityHashMap

  • 特點:使用==而不是equals()比較鍵
  • 線程安全:非線程安全
  • 性能:類似HashMap
  • 排序:不保證順序
  • Java版本:1.4+
  • 典型用途:需要對象標識而非對象值相等的場景
Map<String, Integer> identityMap = new IdentityHashMap<>();

WeakHashMap

  • 特點:使用弱引用存儲鍵,適合做緩存
  • 線程安全:非線程安全
  • 性能:類似HashMap
  • 排序:不保證順序
  • Java版本:1.2+
  • 典型用途:實現內存敏感的緩存
Map<String, Integer> weakMap = new WeakHashMap<>();

4. Java 9+新增的不可變Map

Map.of()/Map.ofEntries()

  • 特點:創建小型不可變Map
  • 線程安全:隱式線程安全
  • 性能:優化的小尺寸Map
  • 排序:不保證順序
  • Java版本:9+
  • 典型用途:創建常量映射或測試數據
// 最多10個鍵值對
Map<String, Integer> immutableMap = Map.of("a", 1, "b", 2);// 更多鍵值對
Map<String, Integer> largerMap = Map.ofEntries(Map.entry("a", 1),Map.entry("b", 2),// ...
);

5. 第三方Map實現

除了JDK自帶的實現,常見的第三方Map實現包括:

  1. Google Guava:

    • ImmutableMap: 真正不可變的Map
    • BiMap: 雙向映射
    • Multimap: 一鍵多值的Map
  2. Eclipse Collections:

    • UnifiedMap: 優化的Map實現
    • ImmutableMap: 不可變版本
  3. Apache Commons Collections:

    • LRUMap: 固定大小的LRU緩存Map
    • MultiKeyMap: 復合鍵Map

選擇指南

需求特征推薦實現
單線程通用映射HashMap
保持插入/訪問順序LinkedHashMap
需要排序TreeMap
高并發環境ConcurrentHashMap
并發且需要排序ConcurrentSkipListMap
枚舉鍵EnumMap
對象標識作為鍵IdentityHashMap
內存敏感緩存WeakHashMap
小型不可變映射Map.of()/Map.ofEntries()
雙向映射Guava BiMap
一鍵多值Guava Multimap

理解這些Map實現的特點和適用場景,可以幫助你在開發中做出更合適的選擇,從而編寫出更高效、更健壯的代碼。

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

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

相關文章

Pytorch Lightning 進階 1 - 梯度檢查點(Gradient Checkpointing)

梯度檢查點&#xff08;Gradient Checkpointing&#xff09;是一種在深度學習訓練中優化顯存使用的技術&#xff0c;尤其適用于處理大型模型&#xff08;如Transformer架構&#xff09;時顯存不足的情況。下面用簡單的例子解釋其工作原理和優缺點&#xff1a; 核心原理 深度學…

SpreadJS 迷你圖:數據趨勢可視化的利器

引言 在數據處理和分析領域&#xff0c;直觀地展示數據趨勢對于理解數據和做出決策至關重要。迷你圖作為一種簡潔而有效的數據可視化方式&#xff0c;在顯示數據趨勢方面發揮著重要作用&#xff0c;尤其在與他人共享數據時&#xff0c;能夠快速傳達關鍵信息。SpreadJS 作為一款…

GESP2024年12月認證C++一級( 第三部分編程題(1)溫度轉換)

參考程序1&#xff1a; #include <cstdio> using namespace std;int main() {double K;scanf("%lf", &K);double C K - 273.15; //轉換為攝氏溫度 double F 32 C * 1.8; //轉換為華氏溫度 if (F > 212) //條件判斷 print…

從零開始手寫redis(18)緩存淘汰算法 FIFO 優化

項目簡介 大家好&#xff0c;我是老馬。 Cache 用于實現一個可拓展的高性能本地緩存。 有人的地方&#xff0c;就有江湖。有高性能的地方&#xff0c;就有 cache。 v1.0.0 版本 以前的 FIFO 實現比較簡單&#xff0c;但是 queue 循環一遍刪除的話&#xff0c;性能實在是太…

用Zynq實現脈沖多普勒雷達信號處理:架構、算法與實現詳解

用Zynq實現脈沖多普勒雷達信號處理:架構、算法與實現詳解 脈沖多普勒(PD)雷達是現代雷達系統的核心技術之一,廣泛應用于機載火控、氣象監測、交通監控等領域。其核心優勢在于能在強雜波背景下檢測運動目標,并精確測量其徑向速度。本文將深入探討如何利用Xilinx Zynq SoC(…

OpenCV CUDA模塊設備層-----線程塊級別的一個內存填充工具函數blockFill()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 在同一個線程塊&#xff08;thread block&#xff09;內&#xff0c;將 [beg, end) 范圍內的數據并行地填充為指定值 value。 它使用了 CUDA 線程…

SAP-ABAP:如何查詢 SAP 事務碼(T-Code)被包含在哪些權限角色或權限對象中

要查詢 SAP 事務碼&#xff08;T-Code&#xff09;被包含在哪些權限角色或權限對象中&#xff0c;可使用以下專業方法&#xff1a; &#x1f50d; 1. 通過權限瀏覽器 (SUIM) - 最推薦 事務碼&#xff1a;SUIM (權限信息系統) 操作步驟&#xff1a; 執行 SUIM → 選擇 “角色…

MySQL 多列 IN 查詢詳解:語法、性能與實戰技巧

在 MySQL 中&#xff0c;多列 IN 查詢是一種強大的篩選工具&#xff0c;它允許通過多字段組合快速過濾數據。相較于傳統的 OR 連接多個條件&#xff0c;這種語法更簡潔高效&#xff0c;尤其適合批量匹配復合鍵或聯合字段的場景。本文將深入解析其用法&#xff0c;并探討性能優化…

自由學習記錄(63)

編碼全稱&#xff1a;AV1&#xff08;Alliance for Open Media Video 1&#xff09;。 算力消耗大&#xff1a;目前&#xff08;截至 2025 年中&#xff09;軟件解碼 AV1 的 CPU 開銷非常高&#xff0c;如果沒有專門的硬件解碼單元&#xff0c;播放高清視頻時會很吃 CPU&#…

日本生活:日語語言學校-日語作文-溝通無國界(4)-題目:喜歡讀書

日本生活&#xff1a;日語語言學校-日語作文-溝通無國界&#xff08;4&#xff09;-題目&#xff1a;喜歡讀書 1-前言2-作文原稿3-作文日語和譯本&#xff08;1&#xff09;日文原文&#xff08;2&#xff09;對應中文&#xff08;3&#xff09;對應英文 4-老師評語5-自我感想&…

C++優化程序的Tips

轉自個人博客 1. 避免創建過多中間變量 過多的中間變量不利于代碼的可讀性&#xff0c;還會增加內存的使用&#xff0c;而且可能導致額外的計算開銷。 將用于同一種情況的變量統一管理&#xff0c;可以使用一種通用的變量來代替多個變量。 2. 函數中習慣使用引用傳參而不是返…

C#Blazor應用-跨平臺WEB開發VB.NET

在 C# 中實現 Blazor 應用需要結合 Razor 語法和 C# 代碼&#xff0c;Blazor 允許使用 C# 同時開發前端和后端邏輯。以下是一個完整的 C# Blazor 實現示例&#xff0c;包含項目創建、基礎組件和數據交互等內容&#xff1a; 一、創建 Blazor 項目 使用 Visual Studio 新建項目 …

前端的安全隱患之API惡意調用

永遠不要相信前端傳來的數據&#xff0c;對于資深開發者而言&#xff0c;這幾乎是一種本能&#xff0c;無需過多解釋。然而&#xff0c;初入職場的開發新手可能會感到困惑&#xff1a;為何要對前端傳來的數據持有如此不信任的態度&#xff1f;難道人與人之間連基本的信任都不存…

基于 Spark 實現 COS 海量數據處理

上周在組內分享了一下這個主題&#xff0c; 我覺得還是摘出一部分當文章輸出出來 分享主要包括三個方面&#xff1a; 1. 項目背景 2.Spark 原理 3. Spark 實戰 項目背景 主要是將海量日志進行多維度處理&#xff1b; 項目難點 1、數據量大&#xff08;壓縮包數量 6TB,60 億條數…

Unity3D 屏幕點擊特效

實現點擊屏幕任意位置播放點擊特效。 屏幕點擊特效 需求 現有一個需求&#xff0c;點擊屏幕任意位置&#xff0c;播放一個點擊特效。 美術已經做好了特效&#xff0c;效果如圖&#xff1a; 特效容器 首先&#xff0c;畫布是 Camera 模式&#xff0c;畫布底下有一個 UIClic…

MCU編程

MCU 編程基礎&#xff1a;概念、架構與實踐 一、什么是 MCU 編程&#xff1f; MCU&#xff08;Microcontroller Unit&#xff0c;微控制器&#xff09; 是將 CPU、內存、外設&#xff08;如 GPIO、UART、ADC&#xff09;集成在單一芯片上的小型計算機系統。MCU 編程即針對這些…

Go語言--語法基礎6--基本數據類型--數組類型(1)

Go 語言提供了數組類型的數據結構。 數組是具有相同唯一類型的一組已編號且長度固定的數據項序列&#xff0c;這種類型可以是任意的 原始類型例如整型、字符串或者自定義類型。相對于去聲明number0,number1, ..., and number99 的變量&#xff0c;使用數組形式 numbers[0], …

左神算法之給定一個數組arr,返回其中的數值的差值等于k的子數組有多少個

目錄 1. 題目2. 解釋3. 思路4. 代碼5. 總結 1. 題目 給定一個數組arr&#xff0c;返回其中的數值的差值等于k的子數組有多少個 2. 解釋 略 3. 思路 直接用hashSet進行存儲&#xff0c;查這個值加上k后的值是否在數組中 4. 代碼 public class Problem01_SubvalueEqualk {…

自回歸(AR)與掩碼(MLM)的核心區別:續寫還是補全?

自回歸(AR)與掩碼(MLM)的核心區別:用例子秒懂 一、核心機制對比:像“續寫”還是“完形填空”? 維度自回歸(Autoregressive)掩碼語言模型(Masked LM)核心目標根據已生成的token,預測下一個token(順序生成)預測句子中被“掩碼”的token(補全缺失信息)輸入輸出輸入…

后端開發兩個月實習總結

前言 本人目前在一家小公司后端開發實習差不多兩個月了&#xff0c;現在準備離職了&#xff0c;就這兩個月的實習經歷寫下這篇文章&#xff0c;既是對自己實習的一個總結&#xff0c;也是給正在找實習的小伙伴以及未來即將進入到后端開發這個行業的同學的分享一下經驗。 一、個…