2017-08-25 6 views
1

から新しいのArrayListを作成し、これらの二つの方法の違いは何私は今日、このコードの複雑な部分に出くわした:は、既存のリスト

public List<MyObject> toNewList(List<MyObject> someObjects) { 

    return new ArrayList<>(Arrays.asList(someObjects.toArray(new MyObject[someObjects.size()]))); 

} 

は、上記のコードと次のコードの間に違いはありますか?

public List<MyObject> toNewList(List<MyObject> someObjects) { 

    return new ArrayList<>(someObjects); 

} 

編集: コミットの歴史を振り返って、コードを委譲への洞察を提供します。ここitterrationsの各されています

まずコミット:

return someObjects.toArray(new MyObject[0]); 

第二には、コミット:

return Arrays.asList(someObjects.toArray(new MyObject[0])); 

第三にコミット:

return Arrays.asList(someObjects.toArray(new MyObject[someObjects.size()])); 

最終コミット:

return new ArrayList<MyObject>(Arrays.asList(someObjects.toArray(new MyObject[someObjects.size()]))); 

きれいなコードをきれいにするための良いリマインダ!

+2

関連するコードのバグを回避したり、コードを自動生成することでバグを修正したりすることができたかもしれませんが、それを書いた人は誰でもやっていることを理解できませんでした。 – user2357112

+0

いいえ、ちょうどその2番目はきれいです。 – nullpointer

+0

'new MyObject [someObjects.size()]'ここにあるすべてのタイプミス? – user3437460

答えて

3

機能的には全く違いはありません。どちらもArrayListのsame constructorを呼び出し、最初は冗長です。

完全に不必要なリストをリストに変換する往復を最初に実行しています。二番目の方法はシンプルで清潔です。

+1

違いがあります。最初の要素は、CPUとメモリを無駄にします。要素を配列(メモリの無駄)に格納することによって、CPUとメモリを2回コピーします(CPUの無駄遣い)。 – Andreas

+1

@アンドレアスそれは私が私の最後の段落で説明したものです。 –

+0

私はあなたの*「全く違いはありません」*にコメントし、単に「往復」と呼ぶものの「コスト」を明確にしました。 – Andreas

関連する問題