8

ListオブジェクトAの を取得しています。次に、取得した をAインスタンスからBApache Commons Collection4インスタンスに変換します。List

    listOfBs = (List<B>) CollectionUtils.collect(listOfAs, componentTransformer);

ただし、最終的には ではなくBArrayのが必要です。List

だから私の質問は、どちらが速いかです。

  1. を使用してリストを変換しますCollectionUtils.collect
  2. を使用して配列を作成しますlistOfBs.toArray(new B[listOfBs.size()])

または

  1. ループオーバーlistOfAs
  2. 各AオブジェクトをBオブジェクトに変換する
  3. 各Bオブジェクトを配列に追加します ( B[] )

最初のアプローチと 2 番目のアプローチの違いは、最初のアプローチの方がコードがはるかに少ないことですが、toArrayメソッドが隠しループや高価な操作をむき出しにするかどうかはわかりません。

2 番目のアプローチでわかることは、リストを 1 回だけループするということですlistOfAs

では、どのアプローチがより高速ですか?

4

2 に答える 2

5

List.toArray()のパフォーマンスについて心配する必要はありません。内部で単一のループに頼るので、その複雑さは直線的です。

Arrays.copyOfで実装され、最終的にはSystem.arraycopyになり、ネイティブ コードで実装されるため、Java レベルのループよりもさらに高速になる可能性があります。

于 2014-04-07T13:07:25.717 に答える
3

この記事を読むのは非常に興味深いです: http://shipilev.net/blog/2016/arrays-wisdom-ancients/#_conclusion

リストを配列に変換するさまざまな方法について詳しく説明します。

結論:listOfBs.toArray(new B[listOfBs.size()])あなたが述べたように使用しないでくださいlistOfBs.toArray(new B[0])

信じられないかもしれませんが、これはより高速です。

于 2016-02-19T11:33:47.170 に答える