2013-11-04 103 views
7

在公司書面測試中,我遇到了一個與Java的ArrayList有關的問題。我的查詢只是實際問題的一小部分。將一個數組列表複製到另一個列表的最快方法

比方說我們有以下功能一個ArrayList中複製到另一個:

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

問題基本要求,以優化這個複製操作。該列表可能包含一百萬個條目。我曾嘗試以下方法:

Collections.copy

System.Arraycopy

中的addAll

但所有這些似乎比給定的方法要慢。我需要一種比給定方法更快的方法,還是最好的方法?

+0

不,這是完全可用的最佳方法。 –

+0

Collections.unmodifiableList(list)更快,但可能不適合打算(我發現在問題中定義極差)。 – Durandal

回答

3

那麼首先我認爲存在一個基準誤差。 public ArrayList(Collection<? extends E> c)使用Arrays.copyOf其在內部使用System.arraycopy(來源here)。因此,System.arraycopyaddAll不能比您提到的代碼慢。

對於這個問題,由於操作必須是O(n),因此不可能有更快的方式(因爲您希望不會丟失類型信息,這可能會節省時鐘週期但非常微不足道)。並且System.arraycopy是最快的方式,因爲它使用本地呼叫快速複製它們。

0

如果您變髒,不安全會稍快。但是,您必須使用反射訪問ArrayLists的基礎Object數組。只有在您處於生命或死亡狀態時才使用此功能。

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

+0

這實際上不應該比'System.arraycopy()'快,因爲它可能調用非常相似的本機代碼。 –

+0

沒有必要。不安全的副本是HotSpot中的一個內在因素,不會進行邊界檢查。但是,如果複製許多小尺寸的陣列,這種差異將會很小,並且只有很顯着。它可能不值得,但是可以給不安全的版本一個鏡頭。 VM不是那麼可預測的:-) –

相關問題