这是一个或许对你有用的社群 一对一交流/面试小册/简历优化/求职解惑欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料《项目实战视频》从书中学往事中“练”《互联网高频面试题》面朝简历学习春暖花开《架构 x 系统设计》摧枯拉朽掌控面试高频场景题《精进 Java 学习指南》系统学习互联网主流技术栈《必读 Java 源码专栏》知其然知其所以然这是一个或许对你有用的开源项目国产Star破10w的开源项目前端包括管理后台、微信小程序后端支持单体、微服务架构RBAC权限、数据权限、SaaS多租户、商城、支付、工作流、大屏报表、ERP、CRM、AI大模型、IoT物联网等功能多模块https://gitee.com/zhijiantianya/ruoyi-vue-pro微服务https://gitee.com/zhijiantianya/yudao-cloud视频教程https://doc.iocoder.cn【国内首批】支持 JDK17/21SpringBoot3、JDK8/11Spring Boot2双版本1. 为什么选择 FastUtil2. 核心集合类型速查表记住这 8 个就够日常 95% 场景3. 最佳实践代码示例直接可复制4. Maven/Gradle 依赖2025 最新5. 生产环境避坑清单血泪经验6. 结论一条替换原则FastUtil 是由意大利计算机科学家 Sebastiano Vigna 维护的开源库它为 Java 原始类型primitive types提供了类型特化的集合实现性能通常比 JDK 集合快2~5 倍内存占用降低40%~70%。在高性能后端、游戏服务器、大数据处理、量化交易等场景中几乎是标配。本文总结 2025 年最新的 FastUtil当前版本 8.5.15常用 API 及生产级最佳实践帮你避开所有常见坑。1. 为什么选择 FastUtil场景JDK HashMapInteger, LongFastUtil Int2LongOpenHashMap内存占用1000万条~1.1 GB~320 MBput/get 速度基准2.8~4.5×GC 压力高大量 Integer/Long 包装对象极低零装箱场景JDK HashMapString, ObjectFastUtil Object2ObjectOpenHashMapString, Object内存占用1000万条~1.2 GB~720 MBput/get 速度基准1.5~3×优化哈希 引用相等GC 压力中等String 不可变但 Object 可能有引用低高效迭代 零额外包装关键String 不是原始类型所以无String2StringOpenHashMap专用类但Object2ObjectOpenHashMapString, String等通用类已足够高效。启用引用相等reference equality可进一步加速用而非equals()。基于 Spring Boot MyBatis Plus Vue Element 实现的后台管理系统 用户小程序支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能项目地址https://github.com/YunaiV/ruoyi-vue-pro视频教程https://doc.iocoder.cn/video/2. 核心集合类型速查表记住这 8 个就够日常 95% 场景原始类型ListSetMapkey→valueObject(e.g., String)ObjectArrayListObjectOpenHashSetObject2ObjectOpenHashMapString, Object、Object2ObjectOpenHashMapString, StringintIntArrayListIntOpenHashSetInt2IntOpenHashMap、Int2ObjectOpenHashMaplongLongArrayListLongOpenHashSetLong2LongOpenHashMap、Long2ObjectOpenHashMapdoubleDoubleArrayListDoubleOpenHashSetDouble2DoubleOpenHashMapfloatFloatArrayListFloatOpenHashSet——byteByteArrayListByteOpenHashSetByte2IntOpenHashMapcharCharArrayListCharOpenHashSet——shortShortArrayList————boolean——BooleanOpenHashSet——推荐永远使用OpenHash系列默认实现它比旧的 RBTree/Champ 更快且内存更省。基于 Spring Cloud Alibaba Gateway Nacos RocketMQ Vue Element 实现的后台管理系统 用户小程序支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能项目地址https://github.com/YunaiV/yudao-cloud视频教程https://doc.iocoder.cn/video/3. 最佳实践代码示例直接可复制3.1 基本替换最常见// 差大量装箱 高内存 MapInteger, Long map new HashMap(); // 好零装箱 极致性能 Int2LongOpenHashMap map new Int2LongOpenHashMap(); // 常用构造方式 Int2LongOpenHashMap map new Int2LongOpenHashMap(1_000_000); // 预估容量 Int2LongOpenHashMap map new Int2LongOpenHashMap(1_000_000, 0.8f); // 指定负载因子3.2 推荐初始化方式避免频繁扩容// 最佳预估容量 高负载因子FastUtil 默认 0.8~0.9比 JDK 0.75 高 int expectedSize 5_000_000; Int2ObjectOpenHashMapUser userMap new Int2ObjectOpenHashMap(expectedSize, 0.9f); // 如果你能接受极少数 rehash负载因子甚至可以调到 0.95f Int2IntOpenHashMap counter new Int2IntOpenHashMap(100_000, 0.95f);3.3 高频操作性能对比 推荐写法Int2LongOpenHashMap map new Int2LongOpenHashMap(); // 1. get 默认值避免 containsKey get 两次查找 long value map.getOrDefault(userId, 0L); // 推荐 long value map.containsKey(id) ? map.get(id) : 0L; // 慢 2 倍 // 2. 计数器模式比 compute 快 3~5 倍 map.addTo(userId, 1L); // 原子 极快 // 等价于 map.put(userId, map.getOrDefault(userId, 0L) 1); // 3. 自增 1 的最快写法 map.addTo(key, 1L); // 4. 批量插入FastUtil 独有 API比 putAll 快 30% int[] keys ...; long[] values ...; map.putAll(IntArrays.forceCopy(keys), LongArrays.forceCopy(values), keys.length);3.4 List 使用技巧// 动态数组比 ArrayListInteger 快 3~5 倍 IntArrayList list new IntArrayList(); list.add(1); list.add(2); // 快速转成原始数组零拷贝 int[] array list.elements(); // 注意不要再往 list 里 add int[] safeArray list.toIntArray(); // 推荐防御性拷贝 // 从已有数组创建零拷贝 int[] raw new int[]{1,2,3,4}; IntArrayList list IntArrayList.wrap(raw); // 直接包装不复制3.5 Set 使用技巧IntOpenHashSet set new IntOpenHashSet(1_000_000, 0.9f); set.add(123); if (set.add(123)) { /* 第一次插入 */ } // 快速转原始数组 int[] array set.toArray(new int[set.size()]);3.6 与 Java Stream 配合推荐方式Int2LongOpenHashMap map ...; // FastUtil 自带原始流比装箱流快 5~10 倍 long sum map.int2LongEntrySet() .fastForEach(entry - total entry.getLongValue()); // 或者并行原始流 map.int2LongEntrySet().parallelStream() .forEach(entry - updateSomeGlobalCounter(entry));3.7 序列化注意事项// FastUtil 默认实现了 Serializable但建议显式指定版本 private static final long serialVersionUID 1L; // 大 Map 序列化建议使用 FastUtil 自带的二进制格式比 JDK 快 5~10 倍 ByteBufferOutput out ...; Int2LongBinaryOpenHashMap.write(out, map); // 极快3.8 String-Object / String-String 替换最常见场景// 差JDK 通用性能一般 MapString, Object map new HashMap(); MapString, String config new HashMap(); // 好FastUtil Object 优化内存/速度提升明显 Object2ObjectOpenHashMapString, Object objMap new Object2ObjectOpenHashMap(); Object2ObjectOpenHashMapString, String strMap new Object2ObjectOpenHashMap(); // 常用构造预估容量 负载因子避免 rehash int expectedSize 500_000; // 如配置项或缓存 Object2ObjectOpenHashMapString, Object objMap new Object2ObjectOpenHashMap(expectedSize, 0.9f); Object2ObjectOpenHashMapString, String strMap new Object2ObjectOpenHashMap(expectedSize, 0.9f); // 启用引用相等推荐String 场景下加速 20%~30%但需确保无 null objMap.referenceEquality(); // 或 strMap.referenceEquality();3.9 高频操作性能对比 推荐写法Object 版Object2ObjectOpenHashMapString, Object map new Object2ObjectOpenHashMap(); // 1. get 默认值单次查找避免 containsKey get Object value map.getOrDefault(userKey, null); // 推荐零额外开销 // 2. 合并操作Object 版 computeIfAbsent比 JDK 快 2x map.computeIfAbsent(key, k - new Object()); // 如懒加载 JSON 对象 // 3. 计数器模式String key int value用混合类型更优 Object2IntOpenHashMapString counter new Object2IntOpenHashMap(); counter.addTo(item, 1); // 原子自增比纯 Object 快 3~5x // 4. 批量插入FastUtil 独有适用于 CSV/JSON 加载 String[] keys {k1, k2}; Object[] values {new Object(), val2}; map.putAll(keys, values, keys.length); // 比 putAll 快 25%~40%3.10 List/Set 使用技巧String 版// 动态 String 列表比 ArrayListString 快 2~4x内存省 30% ObjectArrayListString list new ObjectArrayList(); list.add(item1); list.add(item2); // 快速转数组零拷贝 String[] array list.toStringArray(); // 防御性拷贝推荐 // 从数组创建零拷贝包装 String[] raw {a, b, c}; ObjectArrayListString list ObjectArrayList.wrap(raw); // Set 去重 String高效哈希 ObjectOpenHashSetString set new ObjectOpenHashSet(1_000_000, 0.9f); set.add(unique); if (set.add(duplicate)) { /* 插入成功 */ } String[] uniqueArray set.toStringArray();3.11 与 Java Stream 配合Object 流优化Object2ObjectOpenHashMapString, String map ...; // FastUtil 原始迭代器流比 JDK stream 快 3~7x无装箱 long count map.object2ObjectEntrySet() .fastForEach(entry - total entry.getKey().length()); // e.g., 统计键长度 // 并行处理大 String 集合 map.object2ObjectEntrySet().parallelStream() .forEach(entry - process(entry.getStringKey(), entry.getStringValue()));3.12 序列化注意事项Object 版// Object Map 序列化用 FastUtil 二进制比 JDK 快 4~8x ByteBufferOutput out ...; Object2ObjectOpenHashMap.writeObject2Object(out, map); // 专为 Object2Object // 反序列化 Object2ObjectOpenHashMapString, Object loaded Object2ObjectOpenHashMap.readObject2Object(in);4. Maven/Gradle 依赖2025 最新!-- Maven -- dependency groupIdit.unimi.dsi/groupId artifactIdfastutil/artifactId version8.5.15/version /dependency // Gradle Kotlin DSL implementation(it.unimi.dsi:fastutil:8.5.15)5. 生产环境避坑清单血泪经验坑点正确做法使用new HashMapInteger,...改用new Int2XxxOpenHashMap()map.get(key)返回包装类使用原始方法map.getOrDefault(intKey, 0L)List 使用ArrayList改用IntArrayListfor (Integer i : list)用for (int i : list)或IntIterator序列化超大 Map 超时改用 FastUtil 二进制序列化 API并发修改导致异常使用Int2LongOpenHashMap 分段锁或外部锁使用new HashMapString, Object改用new Object2ObjectOpenHashMapString, Object()referenceEquality()String key 原始 value 仍用 Object优先Object2IntOpenHashMap混合优化迭代 Object 集合用 for-each隐含 equals() 调用用fastIterator()或referenceEquality()加速大 String Set 内存爆炸用ObjectOpenHashSet 预估容量null key/value 处理FastUtil 默认不支持 null key用defaultReturnValue()设置默认值与 Lombok/Spring Boot 集成冲突显式导入it.unimi.dsi.fastutil.objects.*6. 结论一条替换原则只要键或值是原始类型且预计size 10万就必须使用 FastUtil。对于 String/Object预计size 5万或频繁 get/put 时用Object2ObjectOpenHashMap替换 HashMap提升 20% 性能。记住一句话“在 Java 里装箱是性能杀手FastUtil 是解药。”把这篇文章加入你的团队 Wiki下次代码审查看到HashMapInteger, ...就直接贴链接。项目推荐https://github.com/vigna/fastutil快起来吧你的 CPU 会感谢你欢迎加入我的知识星球全面提升技术能力。 加入方式“长按”或“扫描”下方二维码噢星球的内容包括项目实战、面试招聘、源码解析、学习路线。文章有帮助的话在看转发吧。 谢谢支持哟 (*^__^*