Java集合不能直接存储基本类型,需装箱为对象,导致内存和性能开销;应优先使用fastutil等基本类型集合库,避免装箱、减少GC压力,并依数据规模与访问模式合理选型。

Java 中集合(如 List、Map、Set)只能存储对象,不能直接存基本类型。所以当你写 ArrayList<integer></integer> 时,实际存的是 Integer 对象,而非 int 值——这会带来额外内存开销和性能损耗。优化核心就是:**避免不必要的装箱与对象创建,优先用基本类型集合库或合理选型**。
用专门的基本类型集合库替代 JDK 原生集合
JDK 自带的集合框架全部基于 Object,对基本类型天然不友好。比如 ArrayList<integer></integer> 每个元素至少占用 16 字节(对象头 + value 字段 + 对齐填充),而原始 int 只需 4 字节——内存膨胀达 4 倍。
- 推荐使用 fastutil、trove 或 IntelliJ Collections 等第三方库,它们提供
IntArrayList、LongOpenHashSet等纯基本类型集合,底层用数组直接存int[]、long[],无装箱、无对象头、无 GC 压力。 - fastutil 还支持自动扩容、迭代器、序列化,API 与 JDK 高度兼容,迁移成本低。
慎用 Stream + 包装类做中间计算
像 list.stream().mapToInt(Integer::intValue).sum() 看似高效,但如果源头是 ArrayList<integer></integer>,mapToInt 之前已存在大量 Integer 对象;更优方式是:从数据源头就用基本类型容器,或批量转换后复用原生数组。
- 避免
Arrays.asList(1, 2, 3)创建List<integer></integer>——它本质是Arrays$ArrayList,内部仍持Object[],每个字面量都被自动装箱。 - 若必须用 JDK 集合,且只读、数据量小,影响有限;但高频读写或大数据量场景(如缓存、统计聚合),务必切换到基本类型集合。
理解装箱缓存机制,减少重复对象创建
Integer.valueOf(int) 在 -128~127 范围内会复用缓存对象,超出则每次新建。这意味着:
立即学习“Java免费学习笔记(深入)”;
- 频繁使用大整数(如 ID、时间戳)装箱,会持续产生新
Integer实例,加重堆压力和 GC 频率。 - 若业务允许,可考虑用
long替代Long存数组,或用ByteBuffer/Unsafe手动管理内存(高级场景,需谨慎)。
集合选型要匹配实际用途
不是所有场景都需要“极致压缩”。判断依据是:数据规模、访问模式、生命周期。
- 临时短生命周期集合(如方法内局部变量、参数传递),用
ArrayList<integer></integer>问题不大。 - 长期驻留内存的缓存、批量处理中间结果、高频数值计算(如指标聚合、图算法节点权重),必须用
IntArrayList或int[]+ 工具类封装。 - Map 场景同理:
Int2IntOpenHashMap比HashMap<integer integer></integer>内存节省 50% 以上,查找也更快(无 hash 冲突链、无对象寻址跳转)。


















