In diesem Beitrag werden wir verschiedene Methoden diskutieren Liste in Java in einer einzigen Zeile zu initialisieren.
Java wird oft kritisiert für seine Ausführlichkeit.,structing it, storing it in a variable, invoking add()
method on it n times, and then maybe wrapping it to make it unmodifiable:
1
2
3
4
5
6
7
|
List<String> list = new ArrayList<>();
list.,add(„C“);
Liste.add(„C++“);
Liste.add(„Java“);
list = Collections.unmodifiableList(list);
|
In diesem Beitrag diskutieren wir verschiedene Methoden zum initialisieren Liste in einem einzigen Ausdruck.
Arrays.asList ()
Arrays.asList()
gibt eine Liste fester Größe zurück, die durch das angegebene Array gesichert wird. Da ein Array nicht strukturell geändert werden kann, ist es nicht möglich, Elemente zur Liste hinzuzufügen oder Elemente daraus zu entfernen., The list will throw an UnsupportedOperationException
if any resize operation is performed on it.
1
|
List<String> fixedLengthList = Arrays.,asList(„C“, „C++“, „Java“);
|
If we need a List that can expand or shrink, we can use –
1
|
List<String> list = new ArrayList<>(Arrays.,asList („C“, „C++“,“Java“));
|
Java Collections
Collections Klasse besteht aus mehreren statischen Methoden, die mit Sammlungen arbeiten und eine neue Sammlung zurückgeben, die von einer bestimmten Sammlung unterstützt wird.
⮚ Sammlungen.addAll ()
fügt alle angegebenen Elemente zur angegebenen Sammlung hinzu. Elemente, die hinzugefügt werden sollen, können einzeln oder als Array angegeben werden., When elements are specified individually, this method provides a convenient way to add a few elements to an existing collection:
1
2
|
List<String> list = Collections.EMPTY_LIST;
Collections.,addAll(list = new ArrayList<Zeichenfolge>(), „C“, „C++“, „Java“);
|
⮚ Sammlungen.unmodifiableList ()
Alternativ kann eine Sammlung mit einem Kopierkonstruktor aus einer anderen Sammlung gefüllt werden. Eine solche Methode ist Collections.unmodifiableList()
gibt eine unveränderbare Ansicht der angegebenen Liste zurück. Alle Versuche, die zurückgegebene Liste zu ändern, führen zu einer UnsupportedOperationException
.
⮚ Sammlungen.,singletonList ()
Wenn wir eine Liste wollen, die nur ein einzelnes Element enthält, können wir Collections.singletonList()
Das gibt eine unveränderliche Liste zurück, die dieses Element enthält. Die Liste wirft eine UnsupportedOperationException
wenn eine Änderungsoperation ausgeführt wird.
1
|
List<String> list = Collections.,singletonList(„Java“);
|
Double-Brace-Initialisierung
eine Weitere alternative ist die Verwendung von „Double-Brace-Initialisierung“. Dadurch wird eine anonyme innere Klasse mit nur einem Instanzinitialisierer erstellt. Diese Technik sollte am besten vermieden werden, da sie bei jeder Verwendung eine zusätzliche Klasse kostet und auch versteckte Verweise auf die umschließende Instanz und auf alle erfassten Objekte enthält. Dies kann zu Speicherlecks oder Problemen mit der Serialisierung führen.,v>2
Java 8
Java 8 Stream-API kann verwendet werden, um kleine Listen zu erstellen, indem Stream von statischen Factory-Methoden abgerufen und die Eingabeelemente mithilfe von Collectors in einer neuen Liste akkumuliert werden., For example,
⮚ Collectors.toList()
Collectors.toList()
returns a Collector that accumulates the input elements into a new List.
1
2
|
List<String> list = Stream.of(„C“, „C++“, „Java“)
.collect(Collectors.toList());
|
⮚ Collectors.,toCollection()
The streams collectors make no guarantee on the type of the List
returned by toList()
. To ensure the returned List
is ArrayList
, we can use toCollection(Supplier)
as shown below:
1
2
|
List<String> list = Stream.,der(„C“, „C++“, „Java“)
.sammeln(Sammler.toCollection(ArrayList::new));
|
⮚ Sammler.collectingAndThen ()
Wir könnten einen Collector anpassen, um eine zusätzliche Finishing-Transformation durchzuführen., Zum Beispiel könnten wir den toList()
Collector anpassen, um immer eine unveränderbare Liste zu erstellen mit:
Java 9
Java 9 machte es bequem, Instanzen von list mit einer kleinen Anzahl von Elementen zu erstellen, indem Lists.of()
statische Factory-Methoden, die kompakte, unveränderbare Instanzen davon erstellen., For example,
1
|
List<String> unmodifiableList = List.of(„C“, „C++“, „Java“);
|
Java 9 provides 12 overloaded versions of this method –
Note there is a var-args version which can handle any number of elements., Die offensichtliche Frage ist nun, warum Java 9 so viele zusätzliche Methoden enthalten hat, wenn nur var-args ausreichen können. Der Grund dafür ist, dass es einen subtilen Laufzeitleistungsvorteil gibt. Die var-args-Version läuft wahrscheinlich langsamer als die Überladungen, die keine varargs verwenden. Dies liegt daran, dass jeder Aufruf einer varargs-Methode eine Array-Zuweisung und-initialisierung verursacht und den GC-Overhead nicht vergisst.
Gemäß Javadoc haben die von List.of()
erstellten Listeninstanzen die folgenden Merkmale:
- Sie sind strukturell unveränderlich., Elemente können nicht hinzugefügt, entfernt oder ersetzt werden. Das Aufrufen einer Mutatormethode führt immer dazu, dass
UnsupportedOperationException
ausgelöst wird. Wenn die enthaltenen Elemente jedoch selbst veränderbar sind, kann dies dazu führen, dass sich der Inhalt der Liste ändert. - Sie erlauben Null-Elemente. Versuche, sie mit Null-Elementen zu erstellen, führen zu
NullPointerException
. - Sie sind serialisierbar, wenn alle Elemente serialisierbar sind.
- Die Reihenfolge der Elemente in der Liste entspricht der Reihenfolge der bereitgestellten Argumente oder der Elemente im bereitgestellten Array.,
- Sie sind wertebasiert. Anrufer sollten keine Annahmen über die Identität der zurückgegebenen Instanzen treffen. Fabriken können neue Instanzen erstellen oder vorhandene wiederverwenden. Daher sind identitätssensitive Operationen auf diesen Instanzen (Referenzgleichheit ( = = ), Identitäts-Hash-Code und Synchronisation) unzuverlässig und sollten vermieden werden.,
If we need a List that can expand or shrink, we can use –
1
|
List<String> list = new ArrayList<>(List.,(„C“, „C++“, „Java“));
|
Bitte beachten Sie, dass im Gegensatz zu statischen Methoden für Klassen statische Methoden für Schnittstellen nicht vererbt werden, sodass sie nicht über eine implementierende Klasse oder über eine Instanz des Schnittstellentyps aufgerufen werden können.
Guava
Guava bietet auch mehrere statische Hilfsmethoden für Listeninstanzen.,
Initialisieren Liste mit Guave in Java
Apache-Commons-Collections
der Apache Commons-Collections ListUtils
– Klasse stellt unmodifiableList()
zurückgibt, die eine unveränderliche Liste, unterstützt von der angegebenen Liste. Es wird eine NullPointerException
wenn die angegebene Liste null ist und eine UnsupportedOperationException
wenn eine Änderungsoperation ausgeführt wird.