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

时间:2013-11-04 17:45:54

标签: java arraylist

我在公司编写的测试中遇到了与java的ArrayList相关的问题。我的查询只是实际问题的一小部分。

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

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

该问题基本上要求优化此复制操作。列表可能包含一百万个条目。我尝试了以下方法:

Collections.copy

System.Arraycopy

addAll

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

2 个答案:

答案 0 :(得分:3)

首先,我认为存在基准错误。 public ArrayList(Collection<? extends E> c)使用内部使用Arrays.copyOf {来源here)的System.arraycopy。因此,System.arraycopyaddAll不能比您提到的代码慢。

对于这个问题,没有更快的方法(假设您不希望丢失类型信息,可能会节省时钟周期但非常简单),因为操作必须是O(n)System.arraycopy是最快的出路,因为它使用本机调用来快速复制它们。

答案 1 :(得分:0)

如果弄脏了,不安全会稍快一点。但是,您必须使用反射访问ArrayLists的基础Object数组。只有在遇到性能生死攸关的情况下才能使用。

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