java集合框架之Map系列
前言
首先从最常用的HashMap开始。HashMap是基于哈希表实现的,使用数组和链表(或红黑树)的结构。在Java 8之后,当链表长度超过阈值时会转换为红黑树,以提高查询效率。哈希冲突通过链地址法解决。需要明确的是,HashMap允许null键和null值,是非线程安全的。
LinkedHashMap,它继承自HashMap,但内部维护了一个双向链表来维护插入顺序或者访问顺序。这使得LinkedHashMap可以保持元素的顺序,比如用于实现LRU缓存。我需要确认其内部结构是否在HashMap的基础上增加了链表节点,以及如何维护这个链表。
TreeMap,它基于红黑树实现,能够保持键的有序性。TreeMap的键必须实现Comparable接口,或者在构造时提供Comparator。红黑树的自平衡特性保证了基本操作的时间复杂度为O(log n)。本文详细说明红黑树的结构和调整过程,比如插入和删除时的旋转和颜色变换。
Hashtable是早期的线程安全的Map实现,它通过synchronized方法实现同步,但性能较差。其结构与HashMap类似,也是基于哈希表,但不同的是它不允许null键和null值,并且是线程安全的。不过现在通常推荐使用ConcurrentHashMap代替Hashtable。
ConcurrentHashMap是线程安全的,并且在Java 8之后采用了CAS和synchronized来保证并发安全,同时将数据结构改为与HashMap类似的数组+链表/红黑树,但每个桶(Node)在更新时使用同步块。需要了解其分段锁(Java 7)和CAS(Java 8)的演变,以及如何在高并发下提高吞吐量。
EnumMap是专门为枚举类型设计的Map,使用枚举常量的自然顺序作为键,内部用数组存储,效率很高。需要说明其内部如何根据枚举的ordinal()值作为数组索引,以及如何保证类型安全。
WeakHashMap基于哈希表,但键是弱引用,当键不再被外部引用时,条目会被自动移除。适用于需要缓存的场景,需要注意其垃圾回收机制对键的影响,以及如何通过引用队列来清理失效的条目。
还有其他如IdentityHashMap,它使用==代替equals来比较键,适用于需要对象地址相等的情况。其内部实现通常是一个线性探测的哈希表,可能需要解释其哈希冲突解决方式的不同。
本文会逐个Map实现类详细分析实现原理以及数据结构,并在最后总结对比它们的内部数据结构、哈希算法、冲突解决策略、线程安全机制、迭代顺序、允许的键值类型以及性能表现。并要指出各个实现类的适用场景,帮助理解为什么在特定情况下选择某种Map实现。
注意,有些实现类可能在不同Java版本中有变化,例如HashMap在Java 8中的树化改进,ConcurrentHashMap在Java 8中放弃分段锁,采用更细粒度的锁机制。因此,需要确认所讨论的Java版本,这里假设是最新的Java版本。
在细节上,比如初始容量、负载因子、扩容机制、迭代器的快速失败机制等。例如,HashMap的默认初始容量是16,负载因子0.75,当元素数量超过容量乘以负载因子时,会进行扩容,容量翻倍,并重新哈希所有元素。而ConcurrentHashMap在Java 8中可能使用不同的并发策略,如sizeCtl变量控制扩容。
总结来说,我需要逐一分析每个Map实现类的数据结构、关键算法(如哈希函数、树操作)、线程安全处理、性能参数以及典型用例,确保全面而详细地解释它们的实现原理。
Java集合框架中的Map接口有多种实现类,每种实现类在数据结构、线程安全、排序特性等方面各有不同。
1. HashMap
-
数据结构:数组 + 链表/红黑树(Java 8+)。
- 数组(Node<K,V>[] table)作为哈希桶,每个桶可能为链表或红黑树。
- 当链表长度超过8且数组长度≥64时,链表转换为红黑树;当红黑树节点数≤6时,退化为链表。
-
哈希函数:
static final int hash(Object key) {int h;return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); }- 通过异或高位与低位减少哈希冲突。
-
冲突解决:链地址法(拉链法)。
-
扩容机制:
- 默认初始容量16,负载因子0.75。
- 当元素数量超过capacity * loadFactor时,容量翻倍并重新哈希。
-
线程安全:非线程安全,需外部同步。
-
允许键值:允许null键和null值。
2. LinkedHashMap
-
数据结构:继承自HashMap,维护双向链表记录插入顺序或访问顺序。
- 每个节点(Entry<K,V>)新增before和after指针,形成链表。
-
顺序特性:
- 插入顺序(默认):按元素插入顺序迭代。
- 访问顺序(accessOrder=true):每次访问(get/put)将节点移到链表末尾,用于实现LRU缓存。
-
线程安全:非线程安全。
-
示例LRU实现:
public class LRUCache<K,V> extends LinkedHashMap<K,V> {private final int maxCapacity;protected boolean removeEldestEntry(Map.Entry<K,V> eldest) {return size() > maxCapacity;} }
3. TreeMap
-
数据结构:基于红黑树(自平衡二叉搜索树)。
-
红黑树特性:
- 节点为红或黑,根和叶子(NIL)为黑。
- 红节点的子节点必为黑。
- 任一节点到叶子路径的黑节点数相同。
排序机制: - 键必须实现Comparable接口,或构造时提供Comparator。
- 支持自然排序和定制排序。
-
操作复杂度:O(log n)(插入、删除、查找)。
-
线程安全:非线程安全。
4. Hashtable
- 数据结构:数组 + 链表(类似Java 8前的HashMap)。
- 线程安全:通过synchronized方法实现,性能较低。
- 哈希函数:直接使用key.hashCode()。
- 键值限制:不允许null键或值。
- 扩容机制:初始容量11,负载因子0.75,扩容为2n + 1。
5.ConcurrentHashMap
- 数据结构(Java 8+):数组 + 链表/红黑树,类似HashMap。
- 线程安全:
- 分段锁(Java 7):将数据分为多个段(Segment),每段独立加锁。
- CAS + synchronized(Java 8+):桶(Node)头节点无竞争时使用CAS,有竞争时synchronized锁住头节点。
- 并发控制:
- sizeCtl变量控制初始化与扩容。
- 多线程协助扩容(transfer方法)。
- 性能:高并发下吞吐量优于Hashtable和synchronizedMap。
6. WeakHashMap
- 数据结构:数组 + 链表,键为弱引用(WeakReference)。
- 垃圾回收:当键不再被强引用时,条目自动被移除。
- 实现原理:
- 键的弱引用被垃圾回收后,条目加入引用队列(ReferenceQueue)。
- 在get/put/resize时清理失效条目。
- 适用场景:缓存临时数据,防止内存泄漏。
7. EnumMap
- 数据结构:基于枚举常量的序数(ordinal())作为索引的数组。
- 内部数组长度等于枚举类型的常量数量。
- 特性:
- 键必须为同一枚举类型。
- 迭代顺序为枚举常量声明顺序。
- 性能高,无哈希冲突。
- 线程安全:非线程安全。
8. IdentityHashMap
- 数据结构:线性探测哈希表(开放地址法)。
- 键比较:使用==(对象地址)代替equals()。
- 适用场景:需要区分对象地址的场景(如序列化框架)。
对比总结

选择建议
- 快速查找:HashMap(无需排序)。
- 保持插入/访问顺序:LinkedHashMap。
- 键排序需求:TreeMap。
- 高并发场景:ConcurrentHashMap。
- 缓存临时数据:WeakHashMap。
- 枚举键:EnumMap。
- 对象地址比较:IdentityHashMap。
通过理解各Map实现类的内部机制,可针对具体场景选择最合适的实现,优化性能和功能需求。
相关文章:
java集合框架之Map系列
前言 首先从最常用的HashMap开始。HashMap是基于哈希表实现的,使用数组和链表(或红黑树)的结构。在Java 8之后,当链表长度超过阈值时会转换为红黑树,以提高查询效率。哈希冲突通过链地址法解决。需要明确的是ÿ…...
android设置添加设备QR码信息
摘要:客户衍生需求,通过扫QR码快速获取设备基础信息,并且基于POS SDK进行打印。 1. 定位至device info的xml添加相关perference Index: vendor/mediatek/proprietary/packages/apps/MtkSettings/res/xml/my_device_info.xml--- vendor/medi…...
Python实现微博关键词爬虫
1.背景介绍 随着社交媒体的广泛应用,微博上的海量数据成为了很多研究和分析的重要信息源。为了方便获取微博的相关内容,本文将介绍如何使用Python编写一个简单的爬虫脚本,从微博中抓取指定关键词的相关数据,并将这些数据保存为Ex…...
linux概念详解
用户守护进程 用户空间守护进程是一些在后台运行的长期服务程序,提供系统级服务。 下面举一些例子。 网络服务: 如sshd(SSH服务)、httpd(HTTP服务)。 sshd:sshd 守护进程会在后台运行&#x…...
【设计模式】-工厂模式(简单工厂、工厂方法、抽象工厂)
工厂模式(简单工厂、工厂方法、抽象工厂) 介绍 简单工厂模式 简单工厂模式不属于23种GoF设计模式之一,但它是一种常见的设计模式。它提供了一种创建对象的接口,但由子类决定要实例化的类是哪一个。这样,工厂方法模式让类的实例化推迟到子类…...
AMESim中批处理功能的应用
AMESim 软件的批处理功能是一项能显著提高仿真效率和灵活性的功能,以下是其介绍与应用说明: 一 功能介绍 参数扫描功能:用户可以指定模型中一个或多个参数的取值范围和步长,批处理功能会自动遍历这些参数组合,进行多…...
《Spring实战》(第6版)第1章 Spring起步
第1部分 Spring基础 第1章 Spring起步 1.1 什么是Spring Spring的核心是提供一个容器(container)。 称为Spring应用上下文(Spring application context)。 创建和管理应用的组件(bean),与上下文装配在一起。 Bean装配通过依赖注入(Dependency Injection,DI)。…...
E卷-特殊的加密算法-(200分)
专栏订阅🔗 特殊的加密算法 问题描述 有一种特殊的加密算法,明文为一段数字串,经过密码本查找转换,生成另一段密文数字串。规则如下: 明文为一段由 0-9 组成的数字串。密码本为由数字 0-9 组成的二维数组。需要按明文串的数字顺序在密码本里找到同样的数字串,密码本里…...
QT 异步编程之多线程
一、概述 1、在进行桌面应用程序开发的时候,假设应用程序在某些情况下需要处理比较复制的逻辑,如果只有一个线程去处理,就会导致窗口卡顿,无法处理用户的相关操作。这种情况下就需要使用多线程,其中一个线程处理窗口事…...
K-均值(K-means)
K-均值(K-means)是一种常用的无监督学习算法,用于将数据集中的样本分成 K 个簇。该算法的过程大致如下: 1. 随机初始化 K 个聚类中心(centroid)。 2. 将每个样本分配到与其最近的聚类中心所代表的簇。 3. …...
AI agent 未来好的趋势:AI医疗影像、智能客服、个性化推荐
AI agent 未来好的趋势:AI医疗影像、智能客服、个性化推荐 目录 AI agent 未来好的趋势:AI医疗影像、智能客服、个性化推荐比特币AI Agents稳定币扩容区块链AI基础设施AI驱动的软件应用AI赋能的行业应用AI医疗影像、智能客服、个性化推荐AI药物研发比特币 市场与机构化:2024…...
接入 SSL 认证配置:满足等保最佳实践
前言 随着信息安全形势的日益严峻,等保(信息安全等级保护)要求成为各行业信息系统必须遵守的标准。在数据库领域,OpenGauss作为一款高性能、安全、可靠的开源关系型数据库,也需要满足等保要求,确保数据的安…...
微软AutoGen高级功能——Selector Group Chat
介绍 大家好,这次给大家分享的内容是微软AutoGen框架的高级功能Selector Group Chat(选择器群聊),"选择器群聊"我在给大家分享的这篇博文的代码中有所体现微软AutoGen介绍——Custom Agents创建自己的Agents-CSDN博客,但是并没有详…...
w206基于Spring Boot的农商对接系统的设计与实现
🙊作者简介:多年一线开发工作经验,原创团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹赠送计算机毕业设计600个选题excel文…...
Springboot中使用Elasticsearch(部署+使用+讲解 最完整)
目录 引言 一、docker中安装Elasticsearch 1、创建es专有的网络 2、开放端口 3、在es-net网络上安装es和kibana 4、可能出现的问题 5、测试 6、安装IK分词器 7、测试IK分词器 二、结合业务实战 1、准备依赖 2、配置yml 3、读取yml配置 4、准备es配置类 5、编写测…...
深度求索—DeepSeek API的简单调用(Java)
DeepSeek简介 DeepSeek(深度求索)是由中国人工智能公司深度求索(DeepSeek Inc.)研发的大规模语言模型(LLM),专注于提供高效、智能的自然语言处理能力,支持多种场景下的文本生成、对…...
flv实时监控视频
文章目录 前言一、安装二、引入三、使用 前言 开发大屏项目时,可能需要在大屏上展示一个监控画面,此时就可以用的flv.js来展示视频效果 一、安装 npm install flv.js二、引入 import flvjs from flv.js;三、使用 <video ref"videoElement&quo…...
有哪些免费的SEO软件优化工具
随着2025年互联网的不断发展,越来越多的企业意识到在数字营销中,网站的曝光度和排名至关重要。无论是想要提高品牌知名度,还是想要通过在线销售增加收益,SEO(搜索引擎优化)都是一项不可忽视的关键策略。而要…...
跟着ai辅助学习vue3
第一章:基础入门(1 - 2 周) 1. 了解 Vue 3 概述 阅读官方文档简介 访问 Vue 3 官方文档,在首页或简介板块中,重点了解 Vue 3 相较于 Vue 2 的重大变革。比如,Vue 3 采用了 Proxy 实现响应式系统ÿ…...
什么是Mustache
Mustache 是一种轻量级模板引擎,用于将变量插入到模板中生成最终的文本输出。它的设计简单且易于使用,适用于多种编程语言,包括 JavaScript、Python、Ruby、Java 等。 Mustache 的模板语法使用双大括号 {{}} 包裹变量或表达式,用…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...
