【面试】HashMap ConcurrentHashMap 深度解析(面试版) 📅 发布时间:2026/7/5 6:54:08 👁️ 浏览次数: 文章目录一、HashMap非线程安全日常开发最常用1. 核心定义2. 底层结构JDK 1.8 是关键3. 核心原理put方法流程面试必问4. 核心特性面试高频二、ConcurrentHashMap线程安全并发场景专用1. 核心定义2. 底层实现JDK 1.7 vs 1.83. JDK 1.8 核心原理面试核心1线程安全保障2put方法核心逻辑简化版4. 核心特性面试高频三、HashMap vs ConcurrentHashMap 核心对比面试必背总结一、HashMap非线程安全日常开发最常用1. 核心定义HashMap是基于哈希表实现的Map接口实现类存储键值对Key-Value允许Key和Value为nullKey只能有1个nullValue可以多个无序插入顺序≠遍历顺序非线程安全多线程操作会出问题。2. 底层结构JDK 1.8 是关键JDK 1.7数组 链表拉链法解决哈希冲突JDK 1.8数组 链表 红黑树优化哈希冲突提升查询效率当链表长度 8 且数组长度 ≥ 64 时链表转红黑树当红黑树节点数 6 时转回链表。3. 核心原理put方法流程面试必问// 简化版put流程帮你理解核心逻辑publicVput(Kkey,Vvalue){// 1. 计算Key的哈希值扰动函数减少哈希冲突inthashhash(key);// 2. 计算数组下标hash (数组长度-1)等价于取模效率更高intindexhash(table.length-1);// 3. 检查下标位置是否有元素if(table[index]null){// 3.1 无元素直接新建节点放入数组table[index]newNode(hash,key,value,null);}else{// 3.2 有元素处理哈希冲突NodeK,Vptable[index];if(p.hashhash(p.keykey||key.equals(p.key))){// 3.2.1 Key相同覆盖Valuep.valuevalue;}else{// 3.2.2 Key不同遍历链表/红黑树for(intbinCount0;;binCount){if(p.nextnull){// 链表末尾新增节点p.nextnewNode(hash,key,value,null);// 检查是否转红黑树if(binCount7)treeifyBin(table,hash);break;}// 遍历中找到相同Key覆盖Valueif(p.next.hashhash(p.next.keykey||key.equals(p.next.key))){p.next.valuevalue;break;}pp.next;}}}// 4. 检查是否需要扩容数组元素个数 阈值if(sizethreshold)resize();returnnull;}4. 核心特性面试高频扩容机制默认初始容量16负载因子0.75阈值16*0.7512当元素数超过阈值时容量翻倍2倍重新计算所有元素的下标rehash线程安全问题多线程put可能导致链表成环JDK1.7、数据丢失JDK1.8禁止在多线程环境下直接使用为什么数组长度是2的幂哈希值 (长度-1) 等价于 哈希值 % 长度且位运算效率更高同时减少哈希冲突哈希分布更均匀。二、ConcurrentHashMap线程安全并发场景专用1. 核心定义ConcurrentHashMap是HashMap的线程安全版本专为高并发场景设计JDK 1.7和1.8的实现差异极大面试重点问1.8不允许Key或Value为null避免与并发场景下的null返回值混淆。2. 底层实现JDK 1.7 vs 1.8版本核心结构线程安全实现方式效率JDK 1.7分段数组Segment 链表分段锁ReentrantLock锁住单个Segment中等锁粒度大JDK 1.8数组 链表 红黑树CAS synchronized锁住单个节点更高锁粒度小3. JDK 1.8 核心原理面试核心1线程安全保障CAS对数组节点的新增/修改操作用CAS无锁算法保证原子性避免加锁synchronized仅当节点已存在时对单个链表/红黑树节点加synchronized锁而非整个数组锁粒度极小并发效率大幅提升volatile数组节点用volatile修饰保证多线程间的可见性。2put方法核心逻辑简化版publicVput(Kkey,Vvalue){returnputVal(key,value,false);}finalVputVal(Kkey,Vvalue,booleanonlyIfAbsent){// 禁止null键值与HashMap的核心区别之一if(keynull||valuenull)thrownewNullPointerException();inthashspread(key.hashCode());// 哈希值优化intbinCount0;for(NodeK,V[]tabtable;;){NodeK,Vf;intn,i,fh;if(tabnull||(ntab.length)0)tabinitTable();// 初始化数组CAS保证线程安全elseif((ftabAt(tab,i(n-1)hash))null){// 节点为空CAS插入无需加锁if(casTabAt(tab,i,null,newNodeK,V(hash,key,value,null)))break;}elseif((fhf.hash)MOVED)tabhelpTransfer(tab,f);// 扩容时的协助机制else{VoldValnull;// 节点存在对当前节点加synchronized锁锁粒度极小synchronized(f){// 再次检查节点是否被修改防止并发if(tabAt(tab,i)f){// 遍历链表/红黑树逻辑类似HashMap但保证线程安全if(fh0){binCount1;for(NodeK,Vef;;binCount){Kek;if(e.hashhash((eke.key)key||(ek!nullkey.equals(ek)))){oldVale.val;if(!onlyIfAbsent)e.valvalue;break;}NodeK,Vprede;if((ee.next)null){pred.nextnewNodeK,V(hash,key,value,null);break;}}}elseif(finstanceofTreeBin){// 红黑树处理逻辑NodeK,Vp;binCount2;if((p((TreeBinK,V)f).putTreeVal(hash,key,value))!null){oldValp.val;if(!onlyIfAbsent)p.valvalue;}}}}// 检查是否转红黑树if(binCount!0){if(binCountTREEIFY_THRESHOLD)treeifyBin(tab,i);if(oldVal!null)returnoldVal;break;}}}addCount(1L,binCount);// 统计元素数触发扩容returnnull;}4. 核心特性面试高频并发度高JDK1.8锁粒度从“分段”降到“单个节点”并发下性能接近HashMap扩容优化支持多线程协助扩容transfer方法避免单线程扩容耗时与Hashtable的区别Hashtable是对整个表加synchronized锁锁粒度极大效率低ConcurrentHashMap是精细化锁效率远高于Hashtable不支持null键值因为并发场景下null无法区分“键不存在”和“值为null”容易引发逻辑错误。三、HashMap vs ConcurrentHashMap 核心对比面试必背维度HashMapConcurrentHashMap线程安全非线程安全线程安全null键值允许Key/Value为null禁止Key/Value为null锁机制无锁JDK1.7分段锁JDK1.8CASsynchronized性能高无锁高精细化锁并发下优于Hashtable适用场景单线程/无并发的场景多线程高并发场景总结HashMap单线程场景首选底层是数组链表红黑树非线程安全允许null键值扩容为2倍容量哈希冲突用拉链法红黑树优化ConcurrentHashMap并发场景首选JDK1.8用CASsynchronized实现精细化锁禁止null键值性能远优于Hashtable面试高频问法HashMap的扩容机制、JDK1.8的优化点、ConcurrentHashMap的线程安全实现JDK1.7 vs 1.8、为什么ConcurrentHashMap不允许null键值。
vb.net 进行cad二次开发(五) 开发只能抽时间搞,所以步骤总是忘掉了,下面记录一下: 1、打开CAD的自定义菜单文件 视图/工具栏,选择自定义的菜单 2、编辑自定义菜单及命令 新建菜单和子菜单,新建命令,将命令拖到菜单或子菜单中。 程序… 2026/5/17 10:27:34
day108(3.9)——leetcode面试经典150 120. 三角形最小路径和 120. 三角形最小路径和 题目: 题解: class Solution {public int minimumTotal(List<List<Integer>> triangle) {int[][] dp new int[triangle.size()1][triangle.size()1];dp[0][0]triangle.get(0).get(0);//从最… 2026/5/17 10:27:34
互联网大厂Java面试实录:产业互联网场景下Spring微服务、消息队列与AI智能应用全链路深度解析 互联网大厂Java面试实录:产业互联网场景下Spring微服务、消息队列与AI智能应用全链路深度解析 故事背景 谢飞机应聘某产业互联网头部大厂Java开发岗,面试官严肃,面试围绕订单管理、生产调度、智能分析等业务,考察Spring微服务、消… 2026/7/4 20:39:12
【复现】基于噪声抑制半监督学习的锂离子电池SOH估计方法(Python代码实现) 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 🎁… 2026/7/5 6:53:58
【全国二级三级等保】等保测评2.0! 等保2.0!!!全国二级三级等保测评❌ 低价代办:只给文档模板,测评、整改全另收费,报告无法备案,处处隐形消费❌ 单纯咨询服务:只出方案,没人陪测、没人跟进复测,服务单一✅ 我们等保一站式落地&am… 2026/7/5 6:53:58
免费开源AMD Ryzen调试神器:3分钟上手SMUDebugTool硬件掌控完全指南 免费开源AMD Ryzen调试神器:3分钟上手SMUDebugTool硬件掌控完全指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址… 2026/7/5 6:51:58
静音直流电机控制方案:TB9051FTG与PIC18LF46K42应用 1. 项目概述:静音直流电机控制方案在工业自动化和消费电子领域,直流电机的噪声问题一直是工程师面临的挑战。传统PWM控制方式虽然简单高效,但开关噪声和电磁干扰(EMI)问题严重影响设备的使用体验。本项目采用东芝TB9051FTG电机驱动IC与Microc… 2026/7/5 6:51:58
【2027最新】基于SpringBoot+Vue的智慧党建系统管理系统源码+MyBatis+MySQL 博主介绍:👨🎓博主简介 ❤计算机在读硕士 | CSDN 专业博客 | Java 技术布道者 ❤深耕实验室一线,痴迷 Spring Boot 与前后端分离架构,累计原创技术博文 200 篇; ❤手把手指导毕业设计 1000 项,… 2026/7/5 6:49:57
IS31FL3731 LED驱动与R7FA6M3AH3CFC MCU开发指南 1. IS31FL3731 LED驱动芯片深度解析IS31FL3731是一款由Lumissil Microsystems公司推出的高性能LED驱动芯片,专为控制144个单色LED而设计。这款芯片通过I2C接口进行编程控制,具有两个独立的控制区块,每个区块可独立管理72个LED。其核心特性包括… 2026/7/5 6:49:57
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/5 0:01:32
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/5 0:01:32
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/5 0:05:36
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/5 0:01:32
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/5 0:01:32
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/5 0:05:36