2013-11-04 13 views
7

会社の書面によるテストでjavaのArrayListに関する質問が出ました。私の質問は実際の質問のほんの一部です。あるアレイリストを別のアレイリストにコピーする最速の方法

たちは別のArrayListのをコピーするには、以下の機能を持っているとしましょう:

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

質問基本的には、このコピー操作を最適化するように求められます。 Listには百万のエントリが含まれています。 System.arraycopyの

にのaddAll

Collections.copy

しかし、これらのすべては、与えられた方法よりも遅くなるように見える:私は、次のアプローチを試してみました。私は、与えられた方法より速い方法が必要ですか、それとも利用可能な最良の方法ですか?

+0

いいえ、これは完全に利用可能な最良の方法です。 –

+0

Collections.unmodifiableList(list)は高速ですが、目的には不適切です(質問ではあまり定義されていません)。 – Durandal

答えて

3

まず、ベンチマークエラーがあると思います。 public ArrayList(Collection<? extends E> c)は内部でSystem.arraycopy(ソースhere)を使用するArrays.copyOfを使用します。したがって、System.arraycopyまたはaddAllはあなたの言及されたコードより遅くなることができません。

質問のために、操作がO(n)でなければならないので、より高速な方法はありません(タイプ情報を失わないと、クロックサイクルは節約できますが、非常に簡単です)。 System.arraycopyは、ネイティブ・コールを使用してそれらを高速にコピーするための最速の方法です。

0

汚れている場合、Unsafeは少し速くなります。ただし、リフレクションを使用してArrayListの基本となるオブジェクト配列にアクセスする必要があります。パフォーマンスに関して人生や死の状況にある場合にのみ、これを使用してください。

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

+0

これはおそらく 'System.arraycopy()'よりも速いはずはありません。おそらく、これはおそらく非常に似たネイティブコードを呼び出すからです。 –

+0

は必要ありません。安全でないコピーは、HotSpotの組み込みであり、境界チェックを行いません。しかし、その差は最小限であり、多くの小型アレイをコピーする場合にのみ顕著である。それはおそらくそれの価値がないものの、安全でないバージョンにショットを与えることができます。 VMはそれほど予測できません:-) –

関連する問題