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 上找到。


原始标题:List of Primitive Integer Values in Java | Baeldung