使用fastutil等第三方基本类型集合替换arraylist可显著提升性能与内存效率,因避免装箱拆箱、减少对象头和引用指针开销;推荐fastutil为新项目首选,eclipse collections适合stream场景,trove仅限旧系统维护。

直接用第三方基本类型集合(如 FastUtil、IntSet、Trove 或 Eclipse Collections)替换 ArrayList<integer></integer> 这类包装类集合,是 Java 中最有效的内存与性能“瘦身”手段之一。核心逻辑很清晰:避免装箱/拆箱开销 + 跳过对象头和引用指针的内存浪费。
为什么包装类集合需要重构?
Java 集合(如 ArrayList<integer></integer>)实际存储的是 Integer 对象引用,不是 int 值本身:
- 每个
Integer对象至少占用 16 字节(对象头 8B + int 字段 4B + 对齐填充),远超原始int的 4 字节; - 频繁自动装箱(
list.add(123))触发大量短生命周期对象分配,加重 GC 压力; - 遍历时每次
get(i)都隐含一次拆箱,循环中累积可观 CPU 开销。
选哪个第三方库?关键对比
主流选择及适用场景:
-
FastUtil:最成熟稳定,支持全部 8 种基本类型 + 多维数组 + 内存敏感模式(如
IntArrayList、IntOpenHashSet),推荐新项目首选; -
Eclipse Collections:API 更函数式(支持
collectAsIntList()、selectInt()等),与 JDK Stream 兼容性好,适合已有 Stream 流程的项目; -
Trove:轻量老派,
TIntArrayList内存极紧凑,但已多年未更新,仅建议维护旧系统时沿用; - Apache Commons Primitives:功能较基础(无泛型集合类),不推荐新用。
重构三步走:从 List 到 IntArrayList
以 FastUtil 为例,替换 ArrayList<integer></integer>:
-
引入依赖(Maven):
it.unimi.dsi
fastutil
8.5.12 -
替换声明与初始化:
原写法:ArrayList<integer> list = new ArrayList();</integer>
新写法:IntArrayList list = new IntArrayList(); -
统一改写增删查操作:
-
list.add(100)→list.add(100)(参数直接是int,无装箱) -
list.get(i)→list.getInt(i)(返回int,无拆箱) -
list.contains(x)→list.contains(x)(内部直接比数值,不调equals) - 遍历推荐用
forEach()或传统 for 循环:for (int i = 0; i
-
注意事项与避坑点
重构不是简单替换类名,需注意:
-
null 值不支持:基本类型集合天然无法存
null,若原逻辑依赖null表示缺失,需改用哨兵值(如-1)或额外布尔数组标记; -
泛型接口不兼容:
IntArrayList不实现List<integer></integer>,不能直接传给期望该接口的方法——需提取为接口(如自定义IntCollection)或封装适配器; -
序列化需显式处理:FastUtil 集合默认不实现
Serializable,如需持久化,应使用其提供的ObjectInputStream专用读写工具类; -
避免混合使用:不要在同一个业务逻辑里混用
ArrayList<integer></integer>和IntArrayList,否则装箱/拆箱又悄悄回来。










