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 ()?


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<>();

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.


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);

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();

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.


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");

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.


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.)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.