10

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

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

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

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

Collections.copy

System.Arraycopy

全部添加

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

4

2 回答 2

5

那么首先我认为有一个基准错误。内部使用的用途public ArrayList(Collection<? extends E> c)(来源此处)。因此或不能比您提到的代码慢。Arrays.copyOfSystem.arraycopySystem.arraycopyaddAll

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

于 2013-11-04T17:50:18.343 回答
0

如果你弄脏了,Unsafe 会稍微快一些。但是,您必须使用反射访问 ArrayLists 的底层 Object 数组。仅当您在性能方面处于生死攸关的情况下才使用此选项。

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

于 2013-11-04T19:56:41.117 回答