当前位置: 首页 > news >正文

Java Map 集合深度解析(HashMap / ConcurrentHashMap 原理详解)

一、什么是 Map

在 Java 集合体系中,Map 是键值对(Key-Value)结构的集合

特点:

  1. Key唯一

  2. Value可以重复

  3. 通过Key 快速查找 Value

示例:

Map<String,Integer> map = new HashMap<>(); map.put("Tom",18); map.put("Jerry",20); System.out.println(map.get("Tom"));

数据结构:

Key -> Value Tom -> 18 Jerry-> 20

二、Map 集合体系结构

Java 中 Map 的主要实现类:

Map │ ├── HashMap │ ├── LinkedHashMap │ └── WeakHashMap │ ├── TreeMap │ ├── Hashtable │ └── Properties │ └── ConcurrentHashMap

常用实现类:

实现类特点
HashMap最常用,线程不安全
LinkedHashMap有序
TreeMap按 key 排序
Hashtable线程安全(过时)
ConcurrentHashMap高并发线程安全

三、HashMap 底层数据结构

JDK8 HashMap 结构:

数组 + 链表 + 红黑树

结构示意:

数组 table │ ├── Node -> Node -> Node │ ├── Node -> Node │ └── Node -> 红黑树

每个数组元素称为bucket(桶)


四、HashMap 的核心属性

源码(简化):

transient Node<K,V>[] table; transient int size; int threshold; final float loadFactor = 0.75f;

解释:

属性作用
table存储数据数组
size元素数量
threshold扩容阈值
loadFactor负载因子

五、HashMap 的 put() 原理

核心流程:

put(key,value) │ 计算 hash │ 计算数组下标 │ table[index] │ 是否为空 │ │ 为空 不为空 │ │ 直接插入 发生 hash 冲突 │ 链表 / 红黑树

源码流程:

public V put(K key, V value) { return putVal(hash(key), key, value, false, true); }

核心步骤:

1 计算 hash

hash = key.hashCode() ^ (hash >>> 16)

目的:

减少 hash 冲突


2 计算数组索引

index = (n - 1) & hash

例如:

n = 16 index = hash % 16

使用位运算更快


3 处理 hash 冲突

三种情况:

1 数组为空 2 链表 3 红黑树

流程:

数组 │ ├─ Node │ ├─ Node -> Node -> Node │ └─ Node -> 红黑树

六、HashMap 扩容机制(重点)

默认容量:

16

负载因子:

0.75

扩容阈值:

threshold = capacity * loadFactor

默认:

16 * 0.75 = 12

当:

size > 12

触发扩容。


扩容流程

1 创建新数组 2 容量变为原来2倍 3 重新计算hash 4 数据迁移

扩容前:

16

扩容后:

32

七、JDK7 vs JDK8 HashMap

JDK7

结构:

数组 + 链表

插入方式:

头插法

示例:

A -> B -> C

问题:

多线程扩容可能形成环形链表

导致:

CPU 100%

JDK8

结构:

数组 + 链表 + 红黑树

插入方式:

尾插法

解决:

死循环问题

八、为什么引入红黑树

如果 Hash 冲突严重:

链表长度过长

时间复杂度:

O(n)

JDK8 优化:

链表 -> 红黑树

时间复杂度:

O(log n)

红黑树转换条件

链表长度:

>= 8

并且数组长度:

>= 64

源码:

TREEIFY_THRESHOLD = 8 MIN_TREEIFY_CAPACITY = 64

流程:

链表长度 >= 8 │ 数组长度 < 64 │ 优先扩容 │ 数组长度 >= 64 │ 转红黑树

九、Hash 冲突解决方式

Hash 冲突:

两个 key hash 相同

解决方式:

1 拉链法(Java)

数组 + 链表

示例:

index=3 3 -> A -> B -> C

2 开放地址法(Redis)

例如:

线性探测

十、HashMap 为什么容量是 2 的幂

例如:

16 32 64 128

原因:

计算 index:

(n - 1) & hash

例如:

16 -> 1111

位运算效率高:

hash % 16

等价于

hash & 15

十一、HashMap 是否线程安全

答案:

不安全

问题:

1 数据覆盖

A线程 put B线程 put

可能:

size错误

2 JDK7 死循环

扩容时:

链表反转

可能形成:

环形链表

十二、ConcurrentHashMap 原理

用于:

高并发环境

JDK7 实现

结构:

Segment + HashEntry

示意:

Segment │ ├── HashEntry ├── HashEntry

Segment:

类似锁

锁粒度:

Segment锁

默认:

16段锁

JDK8 实现(重大优化)

结构:

数组 + 链表 + 红黑树

和 HashMap 类似:

Node[]

但是:

CAS + synchronized

插入流程

1 CAS 插入 2 如果失败 3 synchronized

优点:

锁粒度更小

十三、HashMap 面试高频问题

1 HashMap 底层结构

数组 + 链表 + 红黑树

2 为什么链表长度是 8 才变红黑树

原因:

1 查询效率
2 空间消耗
3 性能平衡

统计结果:

链表长度超过8概率极低

3 为什么数组长度必须是2的幂

原因:

(n-1) & hash

可以替代:

hash % n

效率更高。


4 HashMap 扩容什么时候触发

条件:

size > capacity * loadFactor

默认:

16 * 0.75 = 12

5 HashMap 允许 null 吗

HashMap:

key 可以为 null value 可以为 null

Hashtable:

不允许 null

十四、Map 常用方法

map.put(key,value) map.get(key) map.remove(key) map.containsKey(key) map.containsValue(value) map.keySet() map.values() map.entrySet()

遍历方式:

entrySet(推荐)

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

效率最高。


十五、总结

Java Map 核心知识:

Map结构 │ HashMap │ 数组 + 链表 + 红黑树 │ hash算法 │ 扩容机制 │ 红黑树优化 │ ConcurrentHashMap并发控制
http://www.jsqmd.com/news/486300/

相关文章:

  • 创建了项目实训博客
  • 基于VirtualLab Fusion的复合光源仿真
  • 计算机毕业设计springboot基于Spark的豆瓣电影数据分析与可视化系统 基于SpringBoot与Spark的豆瓣影片数据挖掘及可视化平台 SpringBoot框架下融合Spark的豆瓣影视信
  • 一篇看懂:进程、服务、启动项、计划任务到底是什么?
  • hot 100 300.最长递增子序列
  • 六城高端腕表维修实操指南:36品牌故障应急+正规网点避坑(表主实测版) - 时光修表匠
  • 第三章:机器学习初醒:从数据中寻找规律
  • 算法设计与分析-习题4.3
  • 2026年青浦区高质量家电门店TOP榜:哪几家值得优先光顾?
  • 零基础Java Web初学者(三):Servlet的两种配置方法
  • 2026 最新|语言发育迟缓优质机构推荐,家长安心选 - 品牌测评鉴赏家
  • 2026少儿英语口语培训机构推荐:三大核心解锁自信沟通力 - 品牌2026
  • 哪个语音公司靠谱?如何选择安全稳定的语音通知平台? - Qqinqin
  • web三个组成部分
  • 2026致孤独症孩子家长:选对训练机构,是给“星星的孩子”最好的底气 - 品牌测评鉴赏家
  • 杭州湖州嘉兴绍兴到广东物流专线哪个公司好
  • System常用接口
  • P14346 [JOISC 2019] 指定城市 / Designated Cities - Link
  • 2026成都自闭症机构大揭秘:如何为孩子找到最佳康复之路 - 品牌测评鉴赏家
  • 深圳坪山青少年篮球培训哪里比较好?2026年机构对比整理 - 前沿公社
  • 科学启蒙,多维成长:2026六大主流少儿英语培训机构推荐 - 品牌2026
  • 孤独症机构怎么选?教育博主实测避坑,2026国标落地后家长必看指南 - 品牌测评鉴赏家
  • 哪家语音通知平台易接入?语音API接口对接指南对比 - Qqinqin
  • 小程序开发定制公司哪家好?2026十大口碑双优小程序开发公司精选 - 品牌种草官
  • 使用 Kettle (Pentaho Data Integration) 創建 MySQL 儲存過程完整教程
  • 西安发育迟缓康复机构怎么选?家长必看的科学筛选指南 - 品牌测评鉴赏家
  • 界面开发详解
  • 嵌入式定时器问题
  • 2026年度甄选:六大主流青少儿英语培训机构推荐 - 品牌2026
  • 警惕!孩子说话晚别乱选机构!3步避开90%的坑,附靠谱参考 - 品牌测评鉴赏家