Die Methode Arrays.asList
gibt eine Liste mit fester Größe zurück, die vom angegebenen Array unterstützt wird. Die Methode gibt eine Instanz zurück, bei ArrayList
der es sich um eine private verschachtelte statische Klasse handelt, die erweitert wird AbstractList
und nicht java.util.ArrayList
. Diese statische Klasse bietet die Implementierung weniger Methoden, z set, indexOf, forEach, replaceAll
. B. usw., aber wenn wir sie aufrufen add
, hat sie keine eigene Implementierung, sondern es wird eine Methode von AbstractList
aufgerufen, die auslöst java.lang.UnsupportedOperationException
.
Das Collections.singletonList
gibt eine unveränderliche Liste zurück die nur das angegebene Objekt enthält und auch serialisierbar ist.
Nebenbei bemerkt verwenden wir für unveränderliche Listen im Allgemeinen Collections.unmodifiableList
eine unveränderbare Ansicht der angegebenen Liste.
List<String> srcList = Arrays.asList("Apple", "Mango", "Banana");
var fruits = new ArrayList<>(srcList);
var unmodifiableList = Collections.unmodifiableList(fruits);
fruits.set(0, "Apricot");
var modFruit = unmodifiableList.get(0);
System.out.println(modFruit); // prints Apricot
Eine nicht modifizierbare Ansichtssammlung ist eine Sammlung, die nicht modifizierbar ist und auch eine Ansicht auf eine Hintergrundsammlung darstellt. Beachten Sie, dass Änderungen an der Hintergrundsammlung möglicherweise weiterhin möglich sind. Wenn sie auftreten, sind sie in der nicht veränderbaren Ansicht sichtbar.
Wir können eine echte unveränderliche Liste in Java 10 und höher haben. Es gibt zwei Möglichkeiten, um eine wirklich unveränderbare Liste zu erhalten :
var unmodifiableList = List.copyOf(srcList);
var unmodifiableList = srcList.stream().collect(Collectors.toUnmodifiableList());
Wenn eine dieser beiden Variablen verwendet wird, ist der Wert weiterhin "Apple" und nicht "Apricot".
Gemäß Dokument von Java 10 :
Die List.of
und List.copyOf
statische Factory - Methoden bieten eine bequeme Möglichkeit , unveränderbare Listen zu erstellen. Die mit diesen Methoden erstellten Listeninstanzen weisen die folgenden Merkmale auf:
- Sie sind nicht veränderbar . Elemente können nicht hinzugefügt, entfernt oder ersetzt werden. Das Aufrufen einer Mutator-Methode in der Liste führt immer
UnsupportedOperationException
zum Auslösen. Wenn die enthaltenen Elemente jedoch selbst veränderbar sind, kann sich der Inhalt der Liste ändern.
- Sie verbieten Nullelemente. Versuche, sie mit Nullelementen 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 angegebenen Argumente oder der Elemente im bereitgestellten Array.
- Sie sind
value-based
. 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.
- Sie werden wie auf der Seite Serialisiertes Formular angegeben serialisiert .
ImmutableList.of()
undLists.newArrayList()
in die Mischung auch werfen .