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

JAVA重点基础、进阶知识及易错点总结(10)Map 接口(HashMap、LinkedHashMap、TreeMap)

Java 巩固进阶 · 第10天主题Map 接口深度解析 —— 键值对的高效艺术 进度概览掌握 Java 中最灵活的数据结构。 核心价值动态数据承载SpringBoot 中接收前端动态参数 (MapString, Object)、MyBatis 多参数传递、Redis Hash 结构映射。高性能查找O(1) 的查询效率是缓存、索引、计数器的基石。并发安全理解HashMap的非线程安全特性掌握ConcurrentHashMap的高并发方案。代码简化利用 Java 8computeIfAbsent等新特性消除冗长的判空逻辑。一、Map 接口核心特性键值对的契约Map 是双列集合核心规则Key 唯一Value 可重复。null 值支持HashMap允许 1 个 null Key 和多个 null ValueTreeMap不允许 null Key (无法比较)。无索引只能通过 Key 访问 Value或通过 Entry 遍历。等价性Key 的重复判断逻辑与HashSet完全一致hashCodeequals或compareTo。⚡ 核心方法速查 (含 Java 8 新特性)方法作用进阶用法/注意V put(K key, V value)添加/修改返回旧 Value若为 null 表示新增V get(Object key)获取 ValueKey 不存在返回 null (注意null 也可能是真实值)V getOrDefault(K key, V default)安全获取推荐避免 NPE如map.get(age, 0)V putIfAbsent(K key, V value)不存在才放原子操作常用于简易分布式锁或缓存填充V computeIfAbsent(K key, Func)计算并放入神器解决“先查后插”的竞态条件和冗长代码V merge(K key, V value, BiFunc)合并值神器用于计数累加、列表合并SetMap.EntryK,V entrySet()获取键值对集合遍历最高效的方式二、HashMap绝对的主力军1. 底层原理深度揭秘 (Java 8)结构数组 (Node[]) 链表 红黑树。哈希计算(key.hashCode() ^ (key.hashCode() 16)) (capacity - 1)。高位异或让高位也参与运算减少哈希冲突尤其当容量较小时。位运算要求容量必须是2 的幂次方这样运算等同于%但更快。树化阈值链表长度 8且数组长度 ≥ 64 → 转为红黑树。链表长度 6 → 退化为链表。为什么是 8泊松分布统计结果概率极低平衡时间与空间。扩容机制阈值capacity * loadFactor(默认 16 * 0.75 12)。扩容新容量 旧容量 * 2。RehashJava 8 优化了扩容逻辑元素要么在原位置要么在原位置 旧容量处无需重新计算 hash。2. ⚠️ 生产环境避坑指南初始容量设定若预估存放 1000 个元素应设为1000 / 0.75 1 ≈ 1334并自动扩容到最近的 2 的幂 (2048)。错误做法new HashMap(1000)→ 实际容量 1024 → 存到 768 个就开始扩容 →多次扩容消耗 CPU。正确做法new HashMap((int)(expectedSize / 0.75f) 1)。Key 的选择必须使用不可变类(如String,Integer) 或字段不可变的对象作为 Key。严禁在放入 Map 后修改 Key 中影响hashCode的字段否则该元素将永久丢失(无法 get无法 remove)。3. Java 8 优雅编程示例场景统计列表中每个单词出现的次数。// ❌ 传统写法 (冗长)for(Stringword:words){if(map.containsKey(word)){map.put(word,map.get(word)1);}else{map.put(word,1);}}// ✅ 进阶写法 1merge (推荐)for(Stringword:words){map.merge(word,1,Integer::sum);// 含义若存在则执行 Integer::sum(旧值, 1)若不存在则放入 1}// ✅ 进阶写法 2computeIfAbsent (适用于复杂对象初始化)// 比如MapString, ListUser userGroupsListUserlistmap.computeIfAbsent(groupId,k-newArrayList());list.add(newUser);// 避免了先 get 判断 null再 put 的两步操作且线程更安全相对三、LinkedHashMap顺序的守护者原理在 HashMap 基础上维护了一条双向链表记录插入顺序或访问顺序。应用场景LRU 缓存重写removeEldestEntry方法自动淘汰最久未使用的元素Spring Cache 默认实现原理之一。配置读取保持application.yml中的配置顺序。JSON 序列化FastJSON/Jackson 默认按插入顺序输出 JSON 字段依赖 LinkedHashMap。四、TreeMap有序的专家原理基于红黑树Key 必须实现Comparable或传入Comparator。特性Key 不能为 null。遍历时 Key 天然有序。支持范围查询subMap(fromKey, toKey),headMap(toKey),tailMap(fromKey)。陷阱去重逻辑完全依赖compareTo返回 0。若两个对象业务上不等equalsfalse但排序相等compareTo0后者会被覆盖务必在比较器中加入主键ID作为最终排序依据。五、并发安全HashMap 的致命弱点1. HashMap 在多线程下的风险数据覆盖多线程同时put可能导致某个线程的写入丢失。死循环 (Java 7)扩容时链表形成环get操作导致 CPU 100% (Java 8 已修复此问题但仍不安全)。结论严禁在多线程环境下直接使用HashMap。2. SpringBoot 中的线程安全方案方案实现特点适用场景ConcurrentHashMapnew ConcurrentHashMap()分段锁 (Java 7) / CAS synchronized (Java 8)。锁粒度细并发度极高。高并发首选本地缓存、计数器、共享配置Synchronized MapCollections.synchronizedMap(new HashMap())全局锁 (synchronized)。性能差。低并发遗留系统兼容Hashtablenew Hashtable()全表锁方法全同步。已过时。❌禁止使用// ✅ 推荐高并发安全 MapMapString,IntegerconcurrentMapnewConcurrentHashMap();concurrentMap.put(key,1);// 支持原子操作concurrentMap.computeIfAbsent(key,k-0);六、 今日实战任务高并发商品计数器背景模拟电商大促场景统计各商品的点击量。需求步骤定义商品类Product属性id(Long),name(String)。重写hashCode和equals(基于 id)。功能实现场景 A (基础 Map)使用HashMapProduct, Integer统计点击量。模拟单线程添加 1000 次点击使用merge方法累加。打印点击量最高的前 3 个商品需转为 List 排序。场景 B (并发挑战)创建HashMap和ConcurrentHashMap两个容器。开启 10 个线程每个线程对同一批 100 个商品随机点击 1000 次。对比最终总数HashMap是否出现数据丢失总数 10 * 100 * 1000ConcurrentHashMap是否准确场景 C (有序输出)使用LinkedHashMap存储验证遍历顺序是否与插入顺序一致按首次点击时间。使用TreeMap存储按商品 ID 升序输出统计结果。进阶要求尝试在遍历HashMap的同时另一个线程进行remove操作观察是否抛出ConcurrentModificationException。使用Iterator安全删除。 代码提示// 线程安全累加ConcurrentHashMapProduct,LongcounternewConcurrentHashMap();// 模拟多线程点击ExecutorServiceexecutorExecutors.newFixedThreadPool(10);for(inti0;i10;i){executor.submit(()-{for(Productp:productList){// merge 是线程安全的吗对于 ConcurrentHashMap 是的counter.merge(p,1L,Long::sum);}});}executor.shutdown(); 第10天 · 核心总结Map 选型铁律默认首选HashMap(单线程最快)。保序需求LinkedHashMap(插入顺序/访问顺序)。排序需求TreeMap(Key 自然排序/定制排序)。并发需求ConcurrentHashMap(唯一推荐高性能线程安全)。禁选Hashtable(过时),Collections.synchronizedMap(性能差)。性能调优预估容量设置合适的initialCapacity避免频繁扩容。Key 必须不可变或放入后不修改关键字段。遍历优先使用entrySet。现代 Java 风格拒绝if-contains-put模式拥抱merge,computeIfAbsent,getOrDefault。利用 Stream API 处理 Map 数据 (entrySet().stream())。SpringBoot 实践Controller 接收动态参数用MapString, Object。本地缓存用ConcurrentHashMap(或 Caffeine/Guava Cache)。JSON 返回时Map 的顺序可能影响前端展示需注意选择 LinkedHashMap。

相关文章:

JAVA重点基础、进阶知识及易错点总结(10)Map 接口(HashMap、LinkedHashMap、TreeMap)

&#x1f680; Java 巩固进阶 第10天 主题&#xff1a;Map 接口深度解析 —— 键值对的高效艺术&#x1f4c5; 进度概览&#xff1a;掌握 Java 中最灵活的数据结构。 &#x1f4a1; 核心价值&#xff1a; 动态数据承载&#xff1a;SpringBoot 中接收前端动态参数 (Map<Stri…...

vue新手福音:快马ai帮你秒建可运行环境,专注学习第一行代码

作为一个刚接触Vue的新手&#xff0c;最让我头疼的就是环境搭建。记得第一次尝试安装Node.js、配置npm、理解脚手架的时候&#xff0c;光是解决各种报错就花了大半天时间。直到发现了InsCode(快马)平台&#xff0c;才明白原来入门可以这么简单。 环境搭建的痛点 传统方式需要先…...

数据开发平台如何落地实操?数据开发平台核心价值是什么?

数据开发平台是企业数字化建设的核心载体&#xff0c;搭建合规高效的数据开发平台&#xff0c;才能打通数据流转全链路&#xff0c;而多数企业落地数据开发平台时&#xff0c;往往陷入流程混乱、效率低下的困境。开始之前给大家分享一份数字化全流程资料包:https://s.fanruan.c…...

UNIGUI 修改网页图标 Delphi

网页图标delphi 软件上方工具栏Project -> Options -> Application -> Icons修改图标点击第一个LoadIcon按钮&#xff0c;然后选择一个你目标的.ioc格式大小是128*128的图标&#xff0c;点击 Save保存即可。服务器运行图标打开ServerModule页面&#xff0c;点击UniSer…...

2026最新Java金三银四面试参考指南公开!

想必有很多小伙伴这会已经在为金三银四面试跳槽做准备了。临近面试肯定是要想办法提升自己的面试能力&#xff0c;这个时候如果还去一昧地提升自己的代码能力对面试是毫无帮助的。大多数人在面试的时候都会遇到以下几种情况&#xff08;大家可以看看自己中了几个&#xff09;&a…...

nli-distilroberta-base前端集成案例:Vue.js构建智能文本分析界面

nli-distilroberta-base前端集成案例&#xff1a;Vue.js构建智能文本分析界面 1. 场景价值与方案概述 电商平台的客服系统每天需要处理大量用户咨询&#xff0c;其中很多问题都涉及产品参数的对比&#xff08;如"这款手机电池容量比A型号大吗&#xff1f;"&#xf…...

大模型赋能多尺度空间智能:从具身感知到地球系统建模的跨学科探索

1. 大模型如何重构空间智能的认知框架 当AlphaGo击败人类棋手时&#xff0c;我们惊叹于AI的策略能力&#xff1b;但当大语言模型开始理解三维空间关系时&#xff0c;这标志着机器认知的质变。空间智能的本质是理解物体间的相对位置、距离和运动规律&#xff0c;这种能力对人类而…...

Unity游戏开发:A*寻路算法实战,5步搞定NPC智能移动(附完整Demo)

Unity游戏开发&#xff1a;A*寻路算法实战指南与高级优化技巧 在游戏开发中&#xff0c;NPC的智能移动一直是开发者需要解决的核心问题之一。想象一下&#xff0c;当玩家在《魔兽世界》中穿越荆棘谷时&#xff0c;那些巡逻的巨魔守卫是如何绕过树木和山丘找到最短路径的&#x…...

告别鉴权内耗,让每一位Java开发者都能轻松上手

写Java的这些年&#xff0c;无论是初入职场的新手&#xff0c;还是深耕多年的老兵&#xff0c;谁没在「鉴权」上栽过跟头&#xff1f; 熬夜啃Spring Security的复杂配置&#xff0c;对着一堆过滤器链抓耳挠腮&#xff1b;用Shiro做前后端分离项目&#xff0c;为了适配Token模式…...

项目分享|LLM驱动的多市场股票智能分析器

项目分享|LLM驱动的多市场股票智能分析器 引言 在股票投资分析中&#xff0c;实时行情跟踪、多维度数据解析和科学决策判断是核心需求&#xff0c;而个人投资者往往面临数据分散、分析耗时、缺乏专业工具的问题。由ZhuLinsen开源的daily_stock_analysis项目完美解决了这些痛点…...

PT工具效率革命:一站式解决PT站点种子管理难题

PT工具效率革命&#xff1a;一站式解决PT站点种子管理难题 【免费下载链接】PT-Plugin-Plus PT 助手 Plus&#xff0c;为 Microsoft Edge、Google Chrome、Firefox 浏览器插件&#xff08;Web Extensions&#xff09;&#xff0c;主要用于辅助下载 PT 站的种子。 项目地址: h…...

Java 面试八股文(全网最全20w字)

一、Java 基础知识 1、Object 类相关方法 getClass 获取当前运行时对象的 Class 对象。hashCode 返回对象的 hash 码。clone 拷贝当前对象&#xff0c; 必须实现 Cloneable 接口。浅拷贝对基本类型进行值拷贝&#xff0c;对引用类型拷贝引用&#xff1b;深拷贝对基本类型进行…...

热门 PyPI 包 LiteLLM 遭投毒,窃取凭据和认证令牌

聚焦源代码安全&#xff0c;网罗国内外最新资讯&#xff01; 编译&#xff1a;代码卫士专栏供应链安全数字化时代&#xff0c;软件无处不在。软件如同社会中的“虚拟人”&#xff0c;已经成为支撑社会正常运转的最基本元素之一&#xff0c;软件的安全性问题也正在成为当今社会的…...

神经高利贷:预支未来技能导致认知崩溃

在软件测试领域&#xff0c;从业者常面临一个隐形威胁&#xff1a;过度追求新技能而忽视认知极限&#xff0c;最终引发崩溃。这种现象被称为“神经高利贷”&#xff0c;即通过预支未来学习能力来应对当前挑战&#xff0c;结果导致认知资源枯竭、错误率飙升&#xff0c;甚至职业…...

脑皮层房地产:公司在我的神经突触建数据中心

在数字时代的浪潮中&#xff0c;一个颠覆性的概念正在兴起&#xff1a;企业将数据中心直接构建于人类神经突触之上&#xff0c;仿佛一场“脑皮层房地产”的革命。这并非科幻小说的臆想&#xff0c;而是对现代分布式系统和人工智能架构的深刻隐喻。对于软件测试从业者而言&#…...

情感GDP报告:测试员负面情绪成经济指标的行业变革

一、导言&#xff1a;情感GDP的崛起与测试行业新坐标 2025年全球情感计算市场规模突破596亿元&#xff08;数据来源&#xff1a;2024年情感计算行业报告&#xff09;&#xff0c;"情感GDP"作为衡量情绪价值的经济指标&#xff0c;正重塑职业评价体系。软件测试领域首…...

【OpenClaw 全面解析:从零到精通】第 025 篇:OpenClaw v2026.3.22+v2026.3.23 安全与架构全面升级:从版本迭代看 AI Agent 工程化实践

系列说明&#xff1a;本系列全面介绍 OpenClaw 开源 AI 智能体框架&#xff0c;从历史背景到核心原理&#xff0c;从安装部署到应用生态。本文为系列第 025 篇&#xff0c;结合 2026 年 3 月 22-24 日最新发布的双版本合并更新&#xff0c;系统解析 OpenClaw 从功能驱动到安全驱…...

嵌入式开发调试与问题诊断实战指南

嵌入式工程师常见问题诊断与调试经验分享1. 典型开发场景分析1.1 开发环境差异问题"在我的开发环境运行正常"是嵌入式工程师最常遇到的困境之一。这种现象通常源于&#xff1a;编译器版本差异&#xff08;GCC/Keil/IAR版本不一致&#xff09;硬件平台差异&#xff08…...

别再傻傻线性扫描了!用Python+Scikit-learn手把手实现IVFFlat图像相似度搜索

用PythonScikit-learn实现IVFFlat图像搜索引擎&#xff1a;从原理到实战 当你面对十万张未分类的图片库&#xff0c;如何快速找到与目标图片最相似的十张&#xff1f;传统线性扫描需要计算所有图片特征的距离&#xff0c;耗时呈线性增长。本文将手把手教你用IVFFlat算法构建高效…...

网络协议与文件系统,小车亮灯实验

网络协议与文件系统 一、项目背景二、项目核心目标与环境二者协同工作流程 四、Linux文件系统与设备操作实战五、完整Python代码实现配置项&#xff08;根据自身硬件调整&#xff09;安全退出函数&#xff1a;捕获CtrlC&#xff0c;关闭LED后退出注册CtrlC信号&#xff0c;绑定…...

中国空间智能,梦想照进现实

2026年初&#xff0c;AI教母李飞飞的AI公司World Labs再次获得一笔10亿美元的投资&#xff0c;投资名单除了传统投资机构外&#xff0c;还不乏英伟达、Autodesk等行业巨头&#xff0c;这清晰地传递出市场信号&#xff1a;继AI大语言模型之后&#xff0c;空间智能已成为AI的下一…...

AI时代程序员创业指南:从超级个体到一人企业

AI时代程序员创业指南&#xff1a;从超级个体到一人企业 AI给了每个人杠杆&#xff0c;但不是每个人都能用好。认知、决策能力&#xff0c;甚至运气&#xff0c;同样重要。 引子&#xff1a;那些"超级个体"的真实故事 最近读到一篇AIX财经的报道&#xff0c;采访了6…...

AS3935闪电传感器Arduino驱动库深度解析与工业级应用

1. 项目概述AS3935 是一款由 AMS&#xff08;现为 ams OSRAM&#xff09;推出的专用闪电检测传感器芯片&#xff0c;集成 RF 前端、数字信号处理器&#xff08;DSP&#xff09;、闪电算法引擎及 IC/SPI 接口&#xff0c;可实现对 40 km 范围内云地闪&#xff08;CG&#xff09;…...

会议纪要助手:OpenClaw+GLM-4.7-Flash实时转录与摘要

会议纪要助手&#xff1a;OpenClawGLM-4.7-Flash实时转录与摘要 1. 为什么需要自动化会议纪要 每次开完会最头疼的就是整理会议纪要。上周三的部门周会结束后&#xff0c;我花了40分钟反复听录音、手敲重点&#xff0c;结果还是漏掉了两个关键决议事项。这种低效重复劳动让我…...

pyNastran:破解工程仿真困境的Python技术革新者

pyNastran&#xff1a;破解工程仿真困境的Python技术革新者 【免费下载链接】pyNastran A Python-based interface tool for Nastrans file formats 项目地址: https://gitcode.com/gh_mirrors/py/pyNastran 揭示行业痛点&#xff1a;有限元分析的三大核心挑战 现代工程…...

汽车智能制造时代,哪些服务商助力智慧供应链?

一辆汽车的诞生&#xff0c;背后是一场精密到分钟的大合唱。当生产线以每小时数十台的速度流转时&#xff0c;任何一个零部件的迟到&#xff0c;都可能导致整条线停摆。一个汽车工厂里&#xff0c;单一产线同时生产多种车型&#xff0c;涉及数以万计的SKU零部件。这些物料必须从…...

YOLOv8改进:MixUp with Consistency——基于混合增强与一致性正则化的鲁棒性目标检测算法

1. 引言目标检测作为计算机视觉领域的核心任务之一&#xff0c;在实际应用中面临着诸多挑战&#xff0c;如光照变化、遮挡、图像噪声以及数据分布偏移等问题。YOLOv8作为当前最先进的目标检测器之一&#xff0c;凭借其高效的网络结构和优秀的性能表现&#xff0c;已在工业界和学…...

告别用人“开盲盒”|江湖背调定义全生命周期风控范式

企业用人别踩坑&#xff01;传统单次背调只有入口安检&#xff0c;无法应对员工在职动态风险&#xff0c;漏洞百出江湖背调以“雇前可信、在职可控”&#xff0c;正式定义全生命周期用工风控范式&#xff0c;筑牢从招聘到离职全链路安全屏障&#xff01;传统背调vs全生命周期风…...

国际大牌入门之选

这些品牌是轻奢饰品界的常青树&#xff0c;设计经典&#xff0c;辨识度高&#xff0c;是很多人的入门首选。卡地亚 27%人推荐猎豹为图腾&#xff0c;工艺精湛&#xff0c;是轻奢界的经典与传奇。宝格丽 24%人推荐跃马徽记是其标志&#xff0c;珠宝设计性感矜贵&#xff0c;灵蛇…...

Steam致命错误failed to load steamui.dll?小白必看的6种实用修复方案

软件获取地址 https://pan.quark.cn/s/4cc6a4c0e881 打开Steam时突然弹出“failed to load steamui.dll”提示&#xff0c;无法进入平台甚至启动Y戏&#xff1f;这是Steam最常见的致命错误之一&#xff0c;在failed to load类问题中占比超4成&#xff0c;很多小白不清楚dll文件…...