2014-04-07 7 views
6

Ich erhalte eine List von Objekt A, dann ich Apache Commons Collection4 verwenden, um mit B Instanzen die erhaltenen List aus mit A Instanzen zu transformieren.List.toArray (Object []) Leistung

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

Doch schließlich muss ich eine Array von Bs haben kein List.

Also meine Frage ist, die schneller ist.

  1. die Liste konvertieren CollectionUtils.collect
  2. ein Array CREATE listOfBs.toArray(new B[listOfBs.size()])

Oder

  1. Schleife über die listOfAs
  2. verändern jedes Ein Objekt zu einem B unter Verwendung von Objekt
  3. Hinzufügen jedes B Objekt auf ein Array (B [])

Der Unterschied zwischen dem ersten Ansatz und dem zweiten Ansatz ist, dass der erste Ansatz viel weniger Code hat, aber ich Ich bin mir nicht sicher, ob die Methode toArray eine versteckte Schleife oder teure Operationen enthält.

Was ich in der zweiten Ansatz sehe, ist, dass ich bin sicher, ich werde nur einmal über die listOfAs Liste loopen.

Also welcher Ansatz ist schneller?

+0

Warum nicht transformieren und sammeln in einem Schritt zu einem Array? Sie sind nicht gezwungen, 'CollectionUtils' zu verwenden. Noch besser, benutze einfach Java 8. –

+0

Ich kann derzeit Java 8 nicht verwenden, obwohl ich gerne den Namen des Features, das Java 8 dafür bietet, kennen würde. Ich kann die Objekte loopen und transformieren, aber weniger Code ist besser. Wenn 'toArray' also keinen großen Leistungseinbruch verursacht, kann ich es verwenden. –

+0

Ich denke nicht, dass es großen Unterschied gibt, wenn Sie einen Blick auf Code 'CollectionUtils.collect' es ist Looping durch Liste und transformierende Objekt, das ist Ihre ersten beiden Schritte von Ihrer alternativen Methode – user902383

Antwort

3

Seien Sie nicht besorgt über die Leistung von List.toArray(), seine Komplexität ist linear wie es auf eine einzige Schleife intern zurückgreifen wird.

Da es mit Arrays.copyOf implementiert ist, das schließlich zu System.arraycopy kommt, das in nativem Code implementiert wird, könnte es potentiell sogar schneller als eine Java-Level-Schleife sein.

+0

Was meinst du mit linear? –

+1

Was ich meine ist, dass Leistung (Zeit) proportional zur Eingabegröße ist, weil es auf einer einzigen Schleife basiert. – kiruwka

2

Sehr interessant ist dieser Artikel zu lesen: http://shipilev.net/blog/2016/arrays-wisdom-ancients/#_conclusion

Es ausführlich über die verschiedenen Möglichkeiten geht in eine Liste in ein Array zu konvertieren.

Fazit: Verwenden Sie nicht listOfBs.toArray(new B[listOfBs.size()]) wie von Ihnen angegeben, aber verwenden Sie listOfBs.toArray(new B[0]).

Ob Sie es glauben oder nicht, das ist schneller.