1. 概述
在本篇文章中,我们将学习如何在 Java 中创建一个包含原生整数(int
)类型的 List
。
我们会介绍使用标准 Java 和一些第三方库的解决方案。
2. 自动装箱机制
Java 的泛型要求类型参数必须是引用类型。也就是说,**我们不能直接写成 List<int>
**。
取而代之的是我们可以使用 List<Integer>
,并利用自动装箱(autoboxing)。自动装箱允许我们像操作原始 int
类型一样来操作 List<Integer>
。但实际上,它仍然是一个对象集合,而不是原始类型。
标准 Java 的做法只是对泛型集合支持原始类型的妥协方案,而且这种机制会带来 装箱/拆箱开销 ✅。
当然,还有其他更好的选择,比如第三方高性能集合库。下面我们一一来看。
3. 使用 Stream API
很多时候其实我们并不真正需要一个具体的 List
实例,只需要对一组数据进行处理即可。
在这种情况下,可以考虑使用 Java 8 引入的 Stream API,尤其是 IntStream
,它提供了一个原生 int
元素序列,并支持聚合操作。
来看个例子:
IntStream stream = IntStream.of(5, 10, 0, 2, -8);
IntStream.of()
是一个静态方法,返回一个顺序流(sequential stream)。
同样地,我们也可以从一个已有的 int[]
数组构造出一个 IntStream
:
int[] primitives = {5, 10, 0, 2, -8};
IntStream stream = IntStream.of(primitives);
接着就可以使用标准 Stream 操作,比如过滤、遍历和聚合等。例如,我们可以计算所有正整数的平均值:
OptionalDouble average = stream.filter(i -> i > 0).average();
⚠️ 最重要的一点是:在这个过程中没有发生任何装箱/拆箱操作。
但如果确实需要一个真正的 List
实例,那就得看看下面这些第三方库了。
4. 使用 Trove
Trove 是一款高性能的 Java 原生类型集合库。
要在 Maven 项目中引入 Trove,只需添加如下依赖:
<dependency>
<groupId>net.sf.trove4j</groupId>
<artifactId>trove4j</artifactId>
<version>3.0.2</version>
</dependency>
有了 Trove,我们可以创建原生类型的列表、映射和集合。
例如,有一个接口 TIntList
及其实现类 TIntArrayList
,专门用于操作 int
类型的列表:
TIntList tList = new TIntArrayList();
虽然 TIntList
并不能直接实现 List
接口,但它的方法设计非常接近。后续提到的几个库也遵循类似的设计思路。
✅ 使用 TIntArrayList
的最大优势在于性能和内存效率 —— 它内部使用 int[]
存储数据,避免了不必要的装箱/拆箱操作。
5. 使用 Fastutil
另一个优秀的高性能原生类型集合库是 Fastutil。
添加依赖如下:
<dependency>
<groupId>it.unimi.dsi</groupId>
<artifactId>fastutil</artifactId>
<version>8.1.0</version>
</dependency>
然后就可以这样使用:
IntArrayList list = new IntArrayList();
默认构造函数会在内部创建一个容量为 16 的 int[]
数组。也可以通过已有数组初始化:
int[] primitives = new int[] {5, 10, 0, 2, -8};
IntArrayList list = new IntArrayList(primitives);
6. 使用 Colt
Colt 是一个面向科学计算的开源高性能库。其中 cern.colt.list
包提供了可变大小的原生类型列表。
首先添加 Maven 依赖:
<dependency>
<groupId>colt</groupId>
<artifactId>colt</artifactId>
<version>1.2.0</version>
</dependency>
Colt 提供的 int
列表类是 cern.colt.list.IntArrayList
:
cern.colt.list.IntArrayList coltList = new cern.colt.list.IntArrayList();
默认初始容量为 10。
7. 使用 Guava
Guava 提供了多种方式将原生数组与集合 API 进行桥接。com.google.common.primitives
包中包含了所有支持原始类型的工具类。
比如,ImmutableIntArray
类可以用来创建不可变的 int
列表。
假设我们有一个 int[]
数组:
int[] primitives = new int[] {5, 10, 0, 2};
可以通过以下方式构建一个不可变列表:
ImmutableIntArray list = ImmutableIntArray.builder().addAll(primitives).build();
此外,它也提供了标准的 List API 方法,使用起来非常方便。
8. 总结
本文展示了在 Java 中创建原生整数类型列表的几种常用方式。我们使用了 Trove、Fastutil、Colt 和 Guava 四个第三方库来进行演示。
每种方案都有其适用场景:
- 如果追求极致性能,推荐使用 Trove 或 Fastutil
- 如果已有项目重度依赖 Guava,那不妨用它的
ImmutableIntArray
- 而对于临时计算任务,Stream API 已经足够 ✅
完整代码示例可以在 GitHub 上找到。