我在公司编写的测试中遇到了与java的ArrayList相关的问题。我的查询只是实际问题的一小部分。
假设我们有以下函数将一个ArrayList复制到另一个:
void function(List<E> l)
{
List<E> m = new ArrayList<E>(l);
}
该问题基本上要求优化此复制操作。列表可能包含一百万个条目。我尝试了以下方法:
Collections.copy
System.Arraycopy
addAll
但所有这些似乎都慢于给定的方法。我需要一个比给定方法更快的方法,或者它是可用的最佳方法?
答案 0 :(得分:3)
首先,我认为存在基准错误。 public ArrayList(Collection<? extends E> c)
使用内部使用Arrays.copyOf
{来源here)的System.arraycopy
。因此,System.arraycopy
或addAll
不能比您提到的代码慢。
对于这个问题,没有更快的方法(假设您不希望丢失类型信息,可能会节省时钟周期但非常简单),因为操作必须是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);