自动装箱对原始包装器 ArrayList 的性能影响

Performance implications of autoboxing on ArrayList of primitive wrappers

Java 不允许我们直接创建 ArrayList 个基元。但是我们可以创建基元包装器 class.

ArrayList

但是当访问原始值时,编译器会自动进行包装和解包。这不是开销吗?我的问题是这对性能有何影响?

在这种情况下,int[] 的表现不会比 ArrayList<Integer> 好吗?

有没有人测量过 int[]ArrayList<Inetger> 对于 Java5.0(首次引入时)和 Java 的后期版本的性能。如果您能分享测试结果,对遇到这个问题的每个人都非常有帮助。

确实增加了一些开销。如果这对您来说是个问题,请考虑使用一些开箱即用的支持原语集合的库。例如 Trove, Guava 或 google 用于另一个库

A question 被问及同一主题,在 20M 元素上的以下基准测试结果 int[]ArrayList(我在我的计算机上重新 运行 , 来自@Wsl_F 问题):

public static void main(String[] args) {
    int n = 20_000_000;
    System.out.println("Warming up...");
    list(n);
    array(n);
    long t0 = System.nanoTime();
    int v = list(n);
    t0 = System.nanoTime() - t0;
    System.out.printf("list %.1f ms (%d)\n", (t0 / 1000000.0), v);

    t0 = System.nanoTime();
    v = array(n);
    t0 = System.nanoTime() - t0;
    System.out.printf("array %.1f ms (%d)\n", (t0 / 1000000.0), v);
}

private static int list(int n) {
    ArrayList<Integer> list = new ArrayList<>(n);
    for (int i = 0; i < n; i++)
        list.add(i);
    return list.get(n/2);
}

private static int array(int n) {
    int[] list = new int[n];
    for (int i = 0; i < n; i++)
        list[i] = i;
    return list[n/2];
}

给我(Eclipse on Ubuntu 16.04 x64 with Intel Core i7):

list 1839,9 ms (10000000)
array 515,9 ms (10000000)

Eclipse Collections, FastUtil, Trove, HPPC 这样的库中的原始 collections 会节省您的内存,并且通常比 Java 中的盒装等效项表现更好。每个库都将提供比 int[] 更丰富的方法集。您最好根据自己的具体用例来比较性能。

我发现这篇标题为“Performance Comparison of Primitive Lists in Java”的 Baeldung 文章比较了 FastUtil、Trove 和 Colt 原始列表。

Eclipse Collections 开源库有几个原始 collections 包括 ListSetBagStackMap 支持所有原始类型。已经有几篇关于性能基准的文章比较了 JDK Collections 与 Eclipse Collections 原语 collections.

的性能

NatTable文章对int[]List<Integer>进行了一些比较。

注意:我是 Eclipse 的提交者 Collections