将一个数组列表复制到另一个数组列表的最快方法

10

我在一场公司的笔试中遇到了一个与Java的ArrayList相关的问题。我的问题只是实际问题的一小部分。

假设我们有以下函数,用于将一个ArrayList复制到另一个ArrayList:

void function(List<E> l)
{
    List<E> m = new ArrayList<E>(l);
}

这个问题基本上是在询问如何优化此复制操作。该列表可能包含一百万个条目。我已经尝试了以下方法:

Collections.copy

System.Arraycopy

addAll

但所有这些方法似乎都比给定的方法慢。我需要一个比给定方法更快的方法,或者它是可用的最佳方法吗?


不,那绝对是可用的最佳方法。 - Louis Wasserman
Collections.unmodifiableList(list)速度更快,但可能不适合意图(在问题中我认为意图定义极其模糊)。 - Durandal
2个回答

5
首先,我认为存在基准错误。`public ArrayList(Collection c)` 使用 `Arrays.copyOf`,该方法内部使用 `System.arraycopy`(源代码在 这里)。因此,`System.arraycopy` 或 `addAll` 不能比您提到的代码更慢。
对于这个问题,如果你不想失去类型信息(可能会节省时钟周期,但非常微不足道),那么就没有更快的方法了,因为操作将必须是 O(n)。而且,`System.arraycopy` 是最快的方式,因为它使用本地调用快速复制它们。

0

如果你想要更快的速度,可以使用Unsafe,但是你需要通过反射来访问ArrayList的底层Object数组。只有在对性能有生死攸关的情况下才使用。

public native void copyMemory(java.lang.Object o, long l, java.lang.Object o1, long l1, long l2);


这实际上不应该比System.arraycopy()更快,因为它可能调用非常相似的本地代码。 - Russell Zahniser
不安全的复制是HotSpot中的内在特性,它不进行边界检查。然而,差异将是微小的,只有在复制许多小型数组时才会显著。然而,这可能不值得一试,因为VM并不那么可预测 :-) - R.Moeller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接