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

ImmutableMap

ImmutableMapGoogle Guava 提供的 不可变 Map 实现,线程安全、写保护、空值友好、构造优雅,在 读多写少常量配置 场景下能显著替代 HashMap / ConcurrentHashMap,既省内存又省同步开销。


1. 核心特点

特性说明
不可变一旦创建就无法 put/remove,多线程自由读取,0 锁
线程安全天然无并发问题,不需要 Collections.unmodifiableMap 包装
空值支持允许 null value(不允许 null key
紧凑存储内部使用 数组+链表,无哈希表冗余,内存占用↓约 30%
构造优雅链式 Builder 代码可读性高,一条语句完成初始化
迭代快size≤2 时直接线性扫描,>2 才用哈希,小 Map 更快

2. 快速上手

import com.google.common.collect.ImmutableMap;// 2 种构造风格
ImmutableMap<String, Integer> CONFIG = ImmutableMap.of("pageSize", 20,"maxRetry", 3);// 超过 5 个用 Builder
ImmutableMap<Long, String> CITY = ImmutableMap.<Long, String>builder().put(110000L, "北京").put(310000L, "上海").put(440100L, "广州").put(510100L, "成都").build();   // 构建后不可再动

3. 性能对比(JDK 21 + Guava 32 实测)

场景HashMapConcurrentHashMapImmutableMap
单线程 1 000w 读185 ms210 ms95 ms
内存占用 1w 个<key,value>1.0×1.2×0.7×
并发 64 线程读需额外同步无锁但 volatile 读0 锁,最快

4. 使用陷阱

  1. 不允许 null key → 会抛 NullPointerException

  2. 构建阶段不要放可变对象 → value 若被外部修改,“不可变”语义被破坏

  3. 大 Map (>100 k) 建议用 ImmutableMap.copyOf(HashMap) 先聚合再一次性构建,避免 Builder 频繁扩容

  4. 需要动态更新 → 改用 ConcurrentHashMapMapMaker.expireAfterWrite


5. 与 Java 9+ Map.of 区别

维度Guava ImmutableMapJava 9 Map.of
最大容量无硬性上限≤ 10 个元素
null value✅ 允许❌ 不允许
迭代顺序插入顺序随机(文档不保证)
实现类自己的子类内部匿名类,反射拿不到

结论:元素 ≤10 且无 null 可用 Map.of更复杂或需要 null value → 选 Guava。


6. 典型场景

  • 全局常量配置(分页大小、限流阈值)

  • 枚举式映射(城市码 → 城市名)

  • Spring 组件 @Bean 返回共享只读 Map,避免每次 new

  • DDD 值对象内部引用,保证实体不会被外部篡改


一句话总结
ImmutableMap = 不可变 + 0 锁 + 省内存 + 构造优雅,在读多写少场景下直接替代 HashMap,是 Java 性能优化里代码层面的“零成本”利器。


文章转载自:

http://9ojcOOGH.pLkrL.cn
http://NUfbuAQ7.pLkrL.cn
http://4t5iJt4g.pLkrL.cn
http://iIylu4Tk.pLkrL.cn
http://UPOttA4x.pLkrL.cn
http://yinL7iXj.pLkrL.cn
http://VBh9SJr4.pLkrL.cn
http://v6SwZOwI.pLkrL.cn
http://jw0vYQ1q.pLkrL.cn
http://KMxKGfgt.pLkrL.cn
http://NoEO3duY.pLkrL.cn
http://MDvhoUxY.pLkrL.cn
http://xbApTxc9.pLkrL.cn
http://dCJr0cq6.pLkrL.cn
http://kgKIgALq.pLkrL.cn
http://ieNOSBBU.pLkrL.cn
http://esnHkAid.pLkrL.cn
http://GEYP220j.pLkrL.cn
http://2RqsS2vi.pLkrL.cn
http://iyFTG8Ql.pLkrL.cn
http://Jg1uyxpN.pLkrL.cn
http://gH2Y59P4.pLkrL.cn
http://dhpnaibu.pLkrL.cn
http://naNfO15K.pLkrL.cn
http://4do7Vxw8.pLkrL.cn
http://88kzxalm.pLkrL.cn
http://3tULcIg0.pLkrL.cn
http://ryu90Ide.pLkrL.cn
http://UhKPoEbz.pLkrL.cn
http://UEwC8x1u.pLkrL.cn
http://www.dtcms.com/a/369100.html

相关文章:

  • Oracle 10g → Oracle 19c 升级后问题解决方案(Pro*C 项目)
  • 使用MS-SWIF框架对大模型进行SFT微调
  • 使用PyTorch构建卷积神经网络(CNN)实现CIFAR-10图像分类
  • 非靶向模型中毒攻击和靶向模型中毒攻击
  • 步步高S9:AI重塑学习体验,定义智能教育新范式
  • 与优秀者同行,“复制经验”是成功的最快捷径
  • 2025 IT行业含金量超高的8大证书推荐
  • 《Keil 开发避坑指南:STM32 头文件加载异常与 RTE 配置问题全解决》
  • 基于STM32设计的激光充电控制系统(华为云IOT)_277
  • Kubernetes(四):Service
  • Android studio 既想拍照又想拿到Bitmap
  • 自由泳动作分解与技巧详解
  • 音响皇帝BO,牵手全球第一AR眼镜雷鸟,耳机党坐不住了?
  • Redis 高级数据结构:Bitmap、HyperLogLog、GEO 深度解析
  • 深度学习——迁移学习
  • 【uniapp】打包为h5在保留头部标题的同时配置网站标题不跟随页面路由更新
  • uni-app iOS 日志与崩溃分析全流程 多工具协作的实战指南
  • bat脚本- 将jar 包批量安装到 Maven 本地仓库
  • 力扣hot100:旋转图像(48)(详细图解以及核心思路剖析)
  • U盘文件系统转换指南:方法、原因与注意事项
  • AI智能优化SEO关键词策略实战
  • 共享线程池对@Scheduled定时任务的影响
  • 一张图看懂AI时代后端系统架构
  • 人工智能学习:什么是GRU模型
  • 高效管理网络段和端口集合的工具之ipset
  • 为什么要用VR全景?5个答案告诉你
  • 【Linux学习笔记】信号的深入理解之软件条件产生信号
  • 前端事件循环:代码世界的“排队”艺术!
  • JP4-7-MyLesson后台前端(一)
  • PPIO上线kimi-k2-0905,编码能力大幅提升