Aus der Collections Framework-Übersicht :
Kollektionen, die keine Änderung (wie unterstützen
add
,remove
undclear
) , werden als nicht änderbar . Sammlungen, die nicht unveränderbar sind, können geändert werden .Sammlungen, die zusätzlich garantieren, dass keine Änderung des
Collection
Objekts sichtbar ist, werden als unveränderlich bezeichnet . Nicht unveränderliche Sammlungen sind veränderlich .
Ich kann den Unterschied nicht verstehen.
Was ist hier der Unterschied zwischen unveränderlich und unveränderlich ?
quelle
list
. Wenn etwas später anrufen kannlist.add(10)
danncoll
diese Änderung reflektiert, also nein, würde ich es nicht unveränderlich nennen.Grundsätzlich handelt es sich bei der
unModifiable
Sammlung um eine Ansicht. Indirekt könnte sie also noch von einer anderen Referenz "modifiziert" werden, die geändert werden kann. Auch wenn es sich nur um eine schreibgeschützte Ansicht einer anderen Sammlung handelt, wird die nicht modifizierbare Sammlung immer mit den neuesten Werten angezeigt, wenn sich die Quellensammlung ändert.Die
immutable
Sammlung kann jedoch als schreibgeschützte Kopie einer anderen Sammlung behandelt und nicht geändert werden. In diesem Fall, wenn sich die Quellensammlung ändert, spiegelt die unveränderliche Sammlung die Änderungen nicht widerHier ist ein Testfall, um diesen Unterschied zu veranschaulichen.
Ausgabe
quelle
modifiableList
alsunModifiableList
auch dieimmutableList
Größe nicht geändert habennew ArrayList<String>(modifiableList)
unveränderliche Liste gibt. Kann nicht geändert werdennew ArrayList<String>(modifiableList)
wegennew
? Vielen Dank.Ich denke, der Hauptunterschied besteht darin, dass der Eigentümer einer veränderlichen Sammlung möglicherweise Zugriff auf die Sammlung auf einen anderen Code gewähren möchte, diesen Zugriff jedoch über eine Schnittstelle bereitstellt, die es dem anderen Code nicht ermöglicht, die Sammlung zu ändern (während diese Funktion vorbehalten bleibt zum Besitzcode). Die Sammlung ist also nicht unveränderlich, aber bestimmte Benutzer dürfen die Sammlung nicht ändern.
Das Java Collection Wrapper-Tutorial von Oracle enthält Folgendes (Hervorhebung hinzugefügt):
quelle
Wenn wir über JDK
Unmodifiable*
gegen Guave sprechenImmutable*
, liegt der Unterschied tatsächlich auch in der Leistung . Unveränderliche Sammlungen können sowohl schneller als auch speichereffizienter sein, wenn sie keine Wrapper für reguläre Sammlungen sind (JDK-Implementierungen sind Wrapper). Unter Berufung auf das Guaventeam :Das JDK bietet Collections.unmodutableXXX-Methoden, aber unserer Meinung nach können dies sein
<...>
quelle
List.of(...)
verwendet wird, tatsächlich zweimal kopiert!So zitieren Sie die Java ™ -Tutorials :
(Hervorhebung von mir)
Das fasst es wirklich zusammen.
quelle
Wie oben erwähnt, ist nicht modifizierbar nicht unveränderlich, da eine nicht modifizierbare Sammlung geändert werden kann, wenn beispielsweise einer nicht modifizierbaren Sammlung eine zugrunde liegende Delegatensammlung vorliegt, auf die von einem anderen Objekt verwiesen wird, und dieses Objekt sie ändert.
In Bezug auf unveränderliche ist es nicht einmal gut definiert. Im Allgemeinen bedeutet dies jedoch, dass sich das Objekt "nicht ändert", dies jedoch rekursiv definiert werden müsste. Zum Beispiel kann ich unveränderliche Klassen definieren, deren Instanzvariablen alle Grundelemente sind und deren Methoden alle keine Argumente enthalten und Grundelemente zurückgeben. Die Methoden ermöglichen dann rekursiv, dass die Instanzvariablen unveränderlich sind und alle Methoden Argumente enthalten, die unveränderlich sind und unveränderliche Werte zurückgeben. Es sollte garantiert werden, dass die Methoden im Laufe der Zeit denselben Wert zurückgeben.
Vorausgesetzt, wir können das, gibt es auch das Konzept Thread sicher. Und Sie könnten glauben gemacht werden, dass unveränderlich (oder nicht changeble im Laufe der Zeit) auch Thread-sicher impliziert. Dies ist jedoch nicht der Fallund das ist der Hauptpunkt, den ich hier mache, der in anderen Antworten noch nicht erwähnt wurde. Ich kann ein unveränderliches Objekt erstellen, das immer die gleichen Ergebnisse zurückgibt, jedoch nicht threadsicher ist. Um dies zu sehen, nehme ich an, dass ich eine unveränderliche Sammlung erstelle, indem ich im Laufe der Zeit Hinzufügungen und Löschungen behalte. Jetzt gibt die unveränderliche Sammlung ihre Elemente zurück, indem sie sich die interne Sammlung ansieht (die sich im Laufe der Zeit ändern kann) und dann (intern) die Elemente hinzufügt und löscht, die nach dem Erstellen der Sammlung hinzugefügt oder gelöscht wurden. Obwohl die Sammlung immer dieselben Elemente zurückgibt, ist sie natürlich nicht threadsicher, nur weil sie den Wert niemals ändert.
Jetzt können wir unveränderlich als Objekte definieren, die threadsicher sind und sich niemals ändern werden. Es gibt Richtlinien zum Erstellen unveränderlicher Klassen, die im Allgemeinen zu solchen Klassen führen. Beachten Sie jedoch, dass es Möglichkeiten gibt, unveränderliche Klassen zu erstellen, bei denen beispielsweise die Thread-Sicherheit berücksichtigt werden muss, wie im obigen Beispiel für die Sammlung "Snapshot" beschrieben.
quelle
In den Java ™ -Tutorials heißt es:
Ich denke, es ist eine gute Erklärung, um den Unterschied zu verstehen.
quelle