Was ist die beste Konstruktion zum Erstellen eines List
Strings? 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:
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<>();
quelle
Lists.newArrayList(1, 2, 3)
lässt Sie mit Elementen initialisieren undLists.newArrayListWithExpectedSize(20)
macht die Bedeutung von20
offensichtlicher alsnew ArrayList<>(20)
. Die "offizielle Antwort" auf diese Frage ist übrigens hier .ArrayList
.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.
quelle
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);
quelle
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();
quelle
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.Wie bereits erläutert hier , die wichtigsten Beweggründe für die Verwendung
Lists
,Sets
etc. sind die Lesbarkeit / Vervielfältigung in Ihrem Code, und für die Typinferenz zu verbessern.quelle
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");
quelle
Stream.of("Hello", "My Name", "Blah")
?)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.
quelle
Sie können
Arrays.asList()
von verwenden,java.util
damit 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.)
quelle