Wie bekomme ich eine unveränderbare Sammlung von Java HashMap?

8
___ answer9043337 ___

Es ist nicht möglich, dies mit einem einzigen API-Aufruf zu tun, Sie müssen das tiefe Klonen verwenden. Klone werden nicht geändert, wenn Sie Änderungen am Original vornehmen. Dieses Thema wurde bereits zuvor in SO erörtert, siehe So klonen Sie ArrayList und klonen Sie auch seinen Inhalt? und Deep clone Dienstprogramm Empfehlung .

    
___ answer9043377 ___

Sie können ein nicht änderbares erstellen Karte

    
___ qstnhdr ___ Wie bekomme ich eine unveränderbare Sammlung von Java HashMap? ___ answer9043401 ___

Das Folgende ist immer noch gültig und beschreibt das beobachtete Problem (siehe das Bit, welche Art von Kopie ausgeführt wird). Ich gebe jedoch keine Antwort auf wie , eine Deep-Copy durchzuführen.

Stattdessen mein Vorschlag ist, die Objekte so zu gestalten, dass sie unveränderlich sind , wodurch dieses Problem vollständig vermieden wird. Nach meiner Erfahrung funktioniert dies sehr gut für die meisten trivialen Objekte (das heißt, Objekte, die keine "Container" sind) und kann Code und Argumentation darüber vereinfachen.

Aus dem Javadoc für %code% :

  

Gibt eine Sammlungsansicht der in dieser Map enthaltenen Werte zurück. Die Sammlung wird von der Karte unterstützt, sodass Änderungen an der Karte in der Sammlung widergespiegelt werden und umgekehrt ...

Vielleicht wäre es von Vorteil, eine Kopie davon zu erstellen?

%Vor%

Das führt im Wesentlichen zu einer flachen Kopie , die "jetzt getrennt" ist. Da eine flache Kopie ist, wird jedoch kein Klon / Kopie der enthaltenen Objekte ausgeführt . (Siehe die Antwort von ɛƨнɛƨн Ǥʋяʋиɢ, wenn Deep-Copy Semantik gewünscht wird: Die Frage selbst scheint in dieser Sache etwas vage zu sein. )

Glückliche Kodierung

    
___ tag123java ___ Java (nicht zu verwechseln mit JavaScript oder JScript oder JS) ist eine universelle objektorientierte Programmiersprache, die für die Verwendung in Verbindung mit der Java Virtual Machine (JVM) entwickelt wurde. "Java-Plattform" ist der Name für ein Computersystem, auf dem Tools zum Entwickeln und Ausführen von Java-Programmen installiert sind. Verwenden Sie dieses Tag für Fragen, die sich auf die Java-Programmiersprache oder Java-Plattform-Tools beziehen. ___ answer9043402 ___

Erstellen Sie eine flache Kopie der ursprünglichen Map mit %code% , und rufen Sie dann die Wertekollektion ab. Dadurch werden zum Zeitpunkt des Aufrufs %code% neue Referenzen auf die Objekte in der ursprünglichen Map erstellt. Offensichtlich werden Änderungen innerhalb der enthaltenen Objekte selbst in der kopierten Sammlung wiedergegeben. Wenn Sie dieses Verhalten möchten, besteht Ihre einzige Möglichkeit darin, die Kartenobjekte in der gewünschten Sammlung zu kopieren.

    
___ tag123collections ___ Auflistungs-APIs stellen Entwicklern eine Reihe von Klassen und Schnittstellen zur Verfügung, mit denen die Sammlung von Objekten vereinfacht wird. ___ tag123hashmap ___ Eine Datenstruktur, die eine Hash-Funktion verwendet, um identifizierende Werte, die als Schlüssel bezeichnet werden, ihren zugehörigen Werten zuzuordnen ___ answer9043373 ___

Google Sammlungen Immutable Map kann Ihnen helfen .

siehe Collections.unmodiableMap auch

    
___
sanre6 28.01.2012, 05:46
quelle

5 Antworten

9

Es ist nicht möglich, dies mit einem einzigen API-Aufruf zu tun, Sie müssen das tiefe Klonen verwenden. Klone werden nicht geändert, wenn Sie Änderungen am Original vornehmen. Dieses Thema wurde bereits zuvor in SO erörtert, siehe So klonen Sie ArrayList und klonen Sie auch seinen Inhalt? und Deep clone Dienstprogramm Empfehlung .

    
Bhesh Gurung 28.01.2012, 06:02
quelle
8
2

Sie können ein nicht änderbares erstellen Karte

    
Justin Muller 28.01.2012 06:12
quelle
2

Das Folgende ist immer noch gültig und beschreibt das beobachtete Problem (siehe das Bit, welche Art von Kopie ausgeführt wird). Ich gebe jedoch keine Antwort auf wie , eine Deep-Copy durchzuführen.

Stattdessen mein Vorschlag ist, die Objekte so zu gestalten, dass sie unveränderlich sind , wodurch dieses Problem vollständig vermieden wird. Nach meiner Erfahrung funktioniert dies sehr gut für die meisten trivialen Objekte (das heißt, Objekte, die keine "Container" sind) und kann Code und Argumentation darüber vereinfachen.

Aus dem Javadoc für HashMap.values :

  

Gibt eine Sammlungsansicht der in dieser Map enthaltenen Werte zurück. Die Sammlung wird von der Karte unterstützt, sodass Änderungen an der Karte in der Sammlung widergespiegelt werden und umgekehrt ...

Vielleicht wäre es von Vorteil, eine Kopie davon zu erstellen?

%Vor%

Das führt im Wesentlichen zu einer flachen Kopie , die "jetzt getrennt" ist. Da eine flache Kopie ist, wird jedoch kein Klon / Kopie der enthaltenen Objekte ausgeführt . (Siehe die Antwort von ɛƨнɛƨн Ǥʋяʋиɢ, wenn Deep-Copy Semantik gewünscht wird: Die Frage selbst scheint in dieser Sache etwas vage zu sein. )

Glückliche Kodierung

    
user166390 28.01.2012 06:19
quelle
0

Erstellen Sie eine flache Kopie der ursprünglichen Map mit HashMap.clone() , und rufen Sie dann die Wertekollektion ab. Dadurch werden zum Zeitpunkt des Aufrufs clone() neue Referenzen auf die Objekte in der ursprünglichen Map erstellt. Offensichtlich werden Änderungen innerhalb der enthaltenen Objekte selbst in der kopierten Sammlung wiedergegeben. Wenn Sie dieses Verhalten möchten, besteht Ihre einzige Möglichkeit darin, die Kartenobjekte in der gewünschten Sammlung zu kopieren.

    
ᴳᵁᴵᴰᴼ 28.01.2012 06:19
quelle

Tags und Links