2012-04-02 8 views
56

Was ist die beste Konstruktion zum Erstellen eines List von Strings? Ist es Lists.newArrayList() (aus Guava) oder new ArrayList()?Lists.newArrayList vs neue ArrayList

ist es nur eine persönliche Vorliebe?
oder ist es nur Typ generische Inferenz?
oder gibt es einen theoretischen oder praktischen Wert bei der Verwendung von Lists.newArrayList()?

+5

Sie lesen sollten, [den Abschnitt über statischen Konstruktoren] (http://code.google.com/p/guava-libraries/wiki/CollectionUtilitiesExplained) – assylias

Antwort

79

Der Guava-Builder speichert die Typargumente mehrmals. Vergleichen:

List<Foo<Bar, Baz>> list = Lists.newArrayList(); 
List<Foo<Bar, Baz>> list = new ArrayList<Foo<Bar, Baz>>(); 

In Java 7 ist allerdings veraltet ein wenig ist, da Sie den Diamanten Betreiber haben:

List<Foo<Bar, Baz>> list = new ArrayList<>(); 
+28

Es ist nicht ganz überflüssig, wegen der Überlastung - ' Listen.newArrayList (1, 2, 3) 'lässt Sie mit Elementen initialisieren, und' Lists.newArrayListWithExpectedSize (20) 'macht die Bedeutung von' 20' deutlicher als 'new ArrayList <> (20)'. Die "offizielle Antwort" auf diese Frage ist übrigens [hier] (http://code.google.com/p/guava-libraries/wiki/CollectionUtilitiesExplained#Static_constructors). –

+10

Ja, aber es ist eine andere Methode. Ich meinte, der No-Arg ist veraltet. – Bozho

+4

Für das, was es wert ist, befreit es auch die Aufruf-Site davon, 'ArrayList' zu importieren. –

24

Von Guava's source:

public static <E> ArrayList<E> newArrayList() { 
    return new ArrayList<E>(); 
} 

das zu tun Alles, was ist für Typinferenz erlaubt - kein Unterschied zur Laufzeit.

3

Wie erläutert here, die Hauptmotivationen für die Verwendung von Lists, Sets usw. sind die Lesbarkeit/Duplizierung in Ihrem Code und für die Art Inferenz zu verbessern.

1

Wie bereits erwähnt, macht Java 7 das obsolet, aber ich benutze die Factory-Methode, weil es später den Typ einer Liste, Menge, Map oder was auch immer einfacher ändert.

4

Dies ist, was Lists.newArrayList tut:

@GwtCompatible(serializable = true) 
public static <E> ArrayList<E> newArrayList() { 
    return new ArrayList<E>(); 
} 

so dass diese beiden im Grunde die gleichen sind, bei der Verwendung von newArrayList den Vorteil hat, auf nicht den generischen Typ zu duplizieren. Dies ist sehr hilfreich für komplexe Generika:

List<Map<X,List<Y>> list = new ArrayList<Map<X,List<Y>>(); 

List<Map<X,List<Y>> list = Lists.newArrayList(); 
+0

Der vollständige Methodenaufruf mit Guava gemäß der Methodensignatur wäre 'Listen. >> newArrayList()'. Sie können den generischen Typ weglassen. Aber Sie können dies auch mit dem Konstruktor tun: 'List >> list = new ArrayList();' funktioniert auch. –

12

einen Punkt hinzufügen, Überlastung Version von Lists.newArrayList() ist nützlicher:

  • Lists.newArrayList(E... elements)
  • Lists.newArrayList(Iterable<? extends E> elements)
  • Lists.newArrayList(Iterator<? extends E> elements)

bieten nützlichere Funktionen als new ArrayList().

Zum Beispiel: new ArrayList() nicht tun kann:

Lists.newArrayList("a","b"); 
Lists.newArrayList(anIterable); 
0

Java 8 Ansatz für ladenen Konstruktoren.

Wenn Sie die überladenen Konstruktoren von Guava verwenden möchten, würde ich einen anderen Weg mit Java 8 Stream Builder empfehlen.

List<String> listTest = Stream.<String>builder.add("Hello").add("My Name").add("Blah").build().collect(Collectors.toList()); 
Verwandte Themen