Bezüglich unmodifiable collection
Betrachten Sie den folgenden code unten
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<Integer> intList1=new ArrayList<Integer>();
List<Integer> intList2;
intList1.add(1);
intList1.add(2);
intList1.add(3);
intList2=Collections.unmodifiableList(intList1);
intList1.add(4);
for(int i=0;i<4;i++)
{
System.out.println(intList2.get(i));
}
}
}
Das Ergebnis des obigen Codes ist
1
2
3
4
Im obigen code erstellen wir ein unveränderbar List intList2
aus dem Inhalt der List intList
1. Aber nach der Collections.unmodifiable
Aussage, wenn ich eine änderung vornehmen zu intList1
dass die Veränderung spiegelt sich auf intList2
. Wie ist das möglich ?
- Man kann nicht
intList2.add()
. Das bedeutet nicht, Sie nichtintList1.add()
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bitte Lesen Sie die Javadoc für
Sammlungen.unmodifiableList
Bedeutet dies, dass der zurückgegebene Ansicht ist unveränderbar. Wenn Sie die original-Referenz, die Sie ändern können, die Sammlung. Wenn Sie die Sammlung dann die änderungen werden in der Ansicht.
Dies hat den Vorteil, dass Sie sehr schnell, d.h. Sie brauchen keine Kopie der Sammlung, aber den Nachteil, dass Sie festgestellt - die daraus resultierende Sammlung ist eine Ansicht.
Um eine wirklich unmodifiable collection, Sie benötigen eine Kopie dann wrap:
Dieser kopiert den Inhalt der
intList1
in eine andere Sammlung dann schließt sich die Sammlung in die unveränderliche variable. Kein Hinweis auf die verpackte Sammlung vorhanden ist.Dies ist teuer - das gesamte zugrunde liegende datastore (ein array in diesem Fall) muss dupliziert werden, die (in der Regel) dauert
O(n)
.Google Guava bietet immutable collections die Lösung einiger der Probleme machen, defensive Kopien:
Aber die Geschwindigkeit ist immer noch das Hauptproblem bei der Verwendung von unveränderlichen Kopien der Sammlungen, sondern als unveränderliche Ansichten.
Es sollte angemerkt werden, dass die übliche Verwendung für
Collections.unmodifiableXXX
ist die Rückkehr aus einer Methode, beispielsweise eine getter:In diesem Fall gibt es zwei Dinge zu beachten:
getThings
zugreifen könnenthings
so die unmodifiability kann nicht gebrochen werden.things
jedes mal, wenn ein getter genannt wurden.Zusammenfassend die Antwort auf Ihre Frage ist ein wenig komplexer, als Sie möglicherweise erwartet haben, und es gibt eine Reihe von Aspekten zu berücksichtigen bei der übergabe Sammlungen um in Ihrer Anwendung.
Aus der Javadoc von Sammlungen.unmodifiableList:
Es verhindern, dass die zurückgegebenen Liste geändert werden, aber die ursprüngliche Liste selbst noch werden kann.
Sammlungen.unmodifiableList gibt eine "read-only" - Sicht der internen Liste. Während das Objekt, das zurückgegeben wurde, ist nicht änderbar die ursprüngliche Liste, auf die es verweist, geändert werden. Beide Objekte zeigen auf das gleiche Objekt im Speicher, so wird es änderungen gemacht.
Hier ist eine gute Erklärung, was geschieht.
Das geschieht, weil die unveränderliche Liste ist intern gesichert für die erste Liste, wenn Sie wirklich wollen, es zu sein, unveränderbar sollten Sie nicht verwenden die erste Liste nicht mehr.
In Ihrem code, den Sie sind
erstellen unmodifiableList in intList2. So sind Sie frei, um Veränderungen in inList1
aber Sie sind nicht erlaubt, änderungen in intList2
versuchen Sie dies:
intList2.add(4);
Sie erhalten
oben Ausnahme.