Gibt es einen Vorteil (oder einen großen Unterschied) bei der Verwendung von Arrays.asList (etwas) gegenüber Collections.singletonList (etwas), um eine Liste mit einem Element zu erstellen? Letzteres macht die zurückgegebene Liste ebenfalls unveränderlich.
java
collections
Howard Grimberg
quelle
quelle
ImmutableList.of()
undLists.newArrayList()
in die Mischung auch werfen .Antworten:
Collections.singletonList(something)
ist unveränderlich, währendArrays.asList(something)
es sich um eineList
Darstellung eines Arrays mit fester Größe handelt, bei der die Liste und das Array im Heap zusammengefügt werden.Arrays.asList(something)
erlaubt nicht strukturelle Änderungen , die sowohl in der Liste als auch im verbundenen Array angezeigt werden. Es wirdUnsupportedOperationException
zum Hinzufügen und Entfernen von Elementen ausgelöst, obwohl Sie ein Element für einen bestimmten Index festlegen können.Alle Änderungen an der Liste, die von zurückgegeben wurden
Collections.singletonList(something)
führen zuUnsupportedOperationException
.Außerdem ist die Kapazität der von zurückgegebenen Liste
Collections.singletonList(something)
immer 1, im Gegensatz dazu,Arrays.asList(something)
deren Kapazität der Größe des gesicherten Arrays entspricht.quelle
Ich möchte nur hinzufügen, dass die Singleton-Liste nicht von einem Array unterstützt wird und nur einen Verweis auf dieses eine Element enthält. Vermutlich würde es weniger Speicher benötigen und kann abhängig von der Anzahl der Listen, die Sie erstellen möchten, von Bedeutung sein.
quelle
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, beiArrayList
der es sich um eine private verschachtelte statische Klasse handelt, die erweitert wirdAbstractList
und nichtjava.util.ArrayList
. Diese statische Klasse bietet die Implementierung weniger Methoden, zset, indexOf, forEach, replaceAll
. B. usw., aber wenn wir sie aufrufenadd
, hat sie keine eigene Implementierung, sondern es wird eine Methode vonAbstractList
aufgerufen, die auslöstjava.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.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 :
quelle