Lists.newArrayList vs new ArrayList

73

Was ist die beste Konstruktion zum Erstellen eines ListStrings? Ist es Lists.newArrayList()(von Guave) oder new ArrayList()?

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

asela38
quelle

Antworten:

95

Der Guaven-Generator speichert die mehrfache Eingabe der Typargumente. Vergleichen Sie:

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

In Java 7 ist es allerdings etwas veraltet, da Sie den Diamantoperator haben:

List<Foo<Bar, Baz>> list = new ArrayList<>();
Bozho
quelle
36
Es ist aufgrund der Überladungen nicht ganz veraltet - Lists.newArrayList(1, 2, 3)lässt Sie mit Elementen initialisieren und Lists.newArrayListWithExpectedSize(20)macht die Bedeutung von 20offensichtlicher als new ArrayList<>(20). Die "offizielle Antwort" auf diese Frage ist übrigens hier .
Louis Wasserman
14
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 Anrufseite vom Importieren ArrayList.
Paul Bellora
2
Ich benutze immer nur List <Foo <Bar, Baz >> list = new ArrayList ();
Ondra Žižka
10
@PaulBellora Erstellt stattdessen einen statischen Import in Guavas-Listen (also keine Reduzierung der Importe oder Verlust der transitiven Abhängigkeit von ArrayList, wenn dies Ihr Ziel war).
Dag
30

Aus Guavas Quelle :

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

Alles, was Sie tun müssen, ist die Typinferenz - kein Unterschied zur Laufzeit.

Paul Bellora
quelle
14

Fügen Sie einen Punkt hinzu: Das Überladen der Version von Lists.newArrayList () ist nützlicher:

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

bieten mehr nützliche Funktionen als new ArrayList().

Zum Beispiel: new ArrayList()kann nicht:

Lists.newArrayList("a","b");
Lists.newArrayList(anIterable);
Gy 声 远 Shengyuan Lu
quelle
4

Dies ist, was Lists.newArrayList tut:

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

Diese beiden sind also im Grunde genommen gleich, wobei die Verwendung von newArrayList den Vorteil hat, dass der generische Typ nicht dupliziert werden muss. Dies ist bei komplexen Generika sehr hilfreich:

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

List<Map<X,List<Y>> list = Lists.newArrayList();
Phlogratos
quelle
Der vollständige Methodenaufruf mit Guava gemäß der Methodensignatur wäre Lists.<Map<X,List<YY>>>newArrayList(). Sie können den Generika-Typ weglassen. Sie können dies aber auch mit dem Konstruktor tun: List<Map<X,List<Y>>> list = new ArrayList();Funktioniert auch.
Matthias Wimmer
3

Wie bereits erläutert hier , die wichtigsten Beweggründe für die Verwendung Lists, Setsetc. sind die Lesbarkeit / Vervielfältigung in Ihrem Code, und für die Typinferenz zu verbessern.

Darrengorman
quelle
2

Java 8-Ansatz für überladene Konstruktoren.

Wenn Sie die überladenen Konstruktoren von Guava verwenden möchten, würde ich eine andere Möglichkeit empfehlen, Java 8 Stream Builder zu verwenden.

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

Wenn Sie eine Java-Version 9+ verwenden, können Sie diese unten verwenden. Diese Methode gibt jedoch eine ImmutableList zurück, sodass Sie keine weiteren Elemente hinzufügen können.

List.of("My","Name", "IS", "this");
Rituraj
quelle
Warum empfehlen Sie das? (Auch warum nicht Stream.of("Hello", "My Name", "Blah")?)
aioobe
@aioobe - das funktioniert auch, aber nur, wenn Ihnen alle Elemente in einer Zeile zur Verfügung stehen, eher wie Deklaration oder fest codierte Werte. Wenn Sie jedoch Werte iterieren müssen, um eine neue Liste zu erstellen, ist Stream Builder die bessere Wahl.
Rituraj
1

Wie bereits erwähnt, macht Java 7 dies überflüssig, aber ich verwende die Factory-Methode, weil es später das Ändern des Typs einer Liste, eines Satzes, einer Karte oder was auch immer erleichtert.

Daveb
quelle
0

Sie können Arrays.asList()von verwenden, java.utildamit Sie Guava nicht verwenden müssen:

List<String> list = Arrays.asList("one","another", null, "one_more")

(Übrigens ist Stream Builder von Java 8 ebenfalls eine Option, aber es ist zu ausführlich und übertrieben für die meisten gängigen Anwendungsfälle.)

ritorujon
quelle