Wie führe ich eine tiefe Kopie eines Objekts in Java aus?
Aug 01, 2025 am 05:01 AMUm eine tiefe Kopie in Java zu implementieren, müssen neue Objekte erstellt werden und alle verschachtelten Objekte rekursiv kopieren, um die Freigabe ver?nderliche Zust?nde zu vermeiden. Zu den spezifischen Methoden geh?ren: 1. Manuelles Kopie mit Kopierkonstruktor. Die Vorteile sind typsicher und kontrollierbar, und die Nachteile sind umst?ndlich und fehleranf?llig. 2.. Verwenden Sie die Serialisierung, um eine tiefe Kopie durch Byte -Streams zu erreichen, wodurch komplexe Objekte automatisch verarbeitet werden k?nnen, jedoch alle Klassen serialisierbar und eine geringe Leistung implementieren k?nnen. 3.. Verwenden Sie Serializationutils von Apache Commons Lang, um den Serialisierungsprozess zu vereinfachen, ist aber auch durch serialisierbare Anforderungen begrenzt. V. Es ist für nicht-serialisierbare Klassen geeignet, verfügt jedoch über eine Leistungsaufwand und erfordert, dass Felder zug?nglich sind. Die Auswahlbasis umfasst Objektkomplexit?t, Serialisierung, Leistungsanforderungen und Anwendungsszenarien. Da Java keinen eingebauten tiefen Kopienmechanismus hat, muss eine geeignete L?sung gem?? den tats?chlichen Bedingungen ausgew?hlt werden.
Das Kopieren von Objekten in Java kann schwierig sein, da das Standardverhalten ( =
) nur die Referenz kopiert und nicht das tats?chliche Objekt. Wenn Sie eine echte tiefe Kopie wünschen, müssen Sie ein neues Objekt erstellen und alle verschachtelten Objekte rekursiv kopieren, damit das Original und die Kopie keinen ver?nderlichen Zustand teilen.

Hier erfahren Sie, wie Sie eine tiefe Kopie in Java durchführen:
1. Manuelle Deep Copy über Konstruktor oder Methode
Die unkomplizierteste (aber ausführliche) M?glichkeit besteht darin, ein neues Objekt manuell zu erstellen und jedes Feld zu kopieren, um sicherzustellen, dass mutable verschachtelte Objekte (wie Listen, Arrays oder andere benutzerdefinierte Objekte) tief kopiert werden.

Person der ?ffentlichen Klasse { privater Zeichenfolge Name; private Adressadresse; // Angenommen, die Adresse ist eine ver?nderliche Klasse ?ffentliche Person (Zeichenfolge Name, Adressadresse) { this.name = name; this.address = Adresse; } // Deep Copy Constructor ?ffentliche Person (Person andere) { this.name = other.name; this.address = new address (other.address); // Tiefe Kopie der Adresse } }
Und in Address
:
?ffentliche Klasse Adresse { private Streichstadt; ?ffentliche Adresse (String City) { this.city = Stadt; } ?ffentliche Adresse (Adresse andere) { this.city = other.city; } }
? Profis : Vollst?ndige Kontrolle, Typ-Safe, keine Abh?ngigkeiten
? Nachteile : für komplexe Objekte mühsam, fehleranf?llige, wenn Sie ein Feld vergessen

2. Serialisation (Klon über Bytestrom) unter Verwendung der Serialisierung)
Eine gemeinsame Problemumgehung für das tiefe Kopieren besteht darin, das Objekt zu serialisieren und zu deserialisieren . Dies erzeugt eine echte tiefe Kopie, vorausgesetzt, alle verschachtelten Objekte sind Serializable
.
import Java.io.*; ?ffentliche Klasse DeepCopy { @Suppresswarnings ("Unbek?mpft") public static <t erweitert serialisierbar> T DeepCopy (T -Objekt) { versuchen { BytearrayoutputStream bos = new bytearrayoutputStream (); ObjectOutputStream OOS = New ObjectOutputStream (BOS); OOS.WriteObject (Objekt); oos.flush (); BytearrayInputStream Bis = neuer BytearrayInputStream (bos.tobytearray ()); ObjectInputStream OIS = New ObjectInputStream (BIS); return (t) ois.readObject (); } catch (ioException | classNotFoundException e) {{ Neue RunTimeException werfen ("Deep Copy fehlgeschlagen", e); } } }
Verwendung:
Person Original = New Person ("Alice", neue Adresse ("NYC"); Person kopiert = DeepCopy.deepcopy (original);
? Profis : Arbeiten für komplexe verschachtelte Objekte automatisch
? Nachteile :
- Alle Klassen müssen
Serializable
implementieren - Kann für gro?e Objekte langsam sein
- Statische und transiente Felder werden nicht kopiert
- Nicht alle Objekte sind serialisierbar (z. B. ?ffnen von Dateien, Sockeln)
3.. Verwenden von Bibliotheken von Drittanbietern (z. B. Apache Commons Lang)
Apache Commons Lang bietet eine SerializationUtils
-Klasse, die den Serialisierungsansatz vereinfacht.
Zu pom.xml
hinzufügen:
<De vorangehen> <gruppeID> org.apache.commons </Groupid> <artifactid> commons-Lang3 </artifactid> <version> 3.12.0 </Version> </abh?ngig>
Dann verwenden Sie:
Person kopiert = (Person) serializationutils.clone (original);
?? Gleiche Einschr?nkungen wie manuelle Serialisierung - alles muss Serializable
sein.
V.
Sie k?nnen das Objekt mit JSON serialisieren und dann zu einem Objekt zurückkehren. Dies ist nützlich, wenn Ihre Objekte bereits JSON-freundlich sind.
Verwenden von GSON :
Person kopiert = new GSON (). FromJson (New GSON (). TOJSON (Original), Person.Class);
? Profis : Arbeitet mit nicht Serializable
Klassen, weit verbreitete
? Nachteile :
- Erfordert, dass alle Felder zug?nglich sind (über Getters/Setter)
- Kann nicht komplexe Objektdiagramme (z. B. Zyklen) verarbeiten (z. B. Zyklen)
- Leistungsaufwand
- Nicht wirklich "Typ-Safe"
Wichtige Punkte, die sich erinnern sollten
- Flache Kopie (
clone()
ohne überschreibung) nur kopieren die Feldwerte - Referenzen verweisen auf dieselben Objekte. - Deep Copy sorgt für keinen gemeinsamen Ver?nderungszustand.
- Betrachten Sie immer Unver?nderlichkeit: Wenn Ihre Objekte unver?nderlich sind (z. B.
String
,LocalDateTime
), kann eine flache Kopie ausreichen. - Seien Sie vorsichtig mit kreisf?rmigen Referenzen - sie k?nnen die Serialisierung brechen.
Also, welche Methode zu w?hlen?
- Für einfache Objekte: Manuelle Kopie mit einem Kopierkonstruktor
- Für komplexe, aber serialisierbare Objekte: Java -Serialisierung oder Apache Commons
- Für Web-Apps mit JSON: GSON/Jackson Roundtrip
- Für leistungskritische Code: Manuelle Deep Copy ist am schnellsten
Grunds?tzlich gibt es in Java keine eingebaute tiefe Kopie-Sie müssen sich selbst rollen oder eine Problemumgehung verwenden. W?hlen Sie die Methode aus, die zu Ihrem Anwendungsfall und Ihren Einschr?nkungen passt.
Das obige ist der detaillierte Inhalt vonWie führe ich eine tiefe Kopie eines Objekts in Java aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Hei?e KI -Werkzeuge

Undress AI Tool
Ausziehbilder kostenlos

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem v?llig kostenlosen KI-Gesichtstausch-Tool aus!

Hei?er Artikel

Hei?e Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Hei?e Themen





Setupamaven/GradleProjectWithjax-rsdependencies-?hnlich Jersey; 2. CreatearestresourcEUntationSuchas@pathand@Get; 3.ConfiguretheApplicationviaApplicationSubclitsorweb.xml;

Maven ist ein Standardwerkzeug für Java -Projektmanagement und -aufbau. Die Antwort liegt in der Tatsache, dass Pom.xml verwendet wird, um Projektstruktur, Abh?ngigkeitsmanagement, Konstruktionslebenszyklusautomation und Plug-in-Erweiterungen zu standardisieren. 1. Verwenden Sie POM.xml, um Gruppen, Artefaktid, Version und Abh?ngigkeiten zu definieren; 2. Master -Kernbefehle wie MVNClean, Compile, Test, Paket, Installation und Bereitstellen; Fn. V. 5.

Um Hash -Werte mit Java zu generieren, kann es über die MessagedIGest -Klasse implementiert werden. 1. Holen Sie sich eine Instanz des angegebenen Algorithmus wie MD5 oder SHA-256; 2. Rufen Sie die Methode .update () auf, um die zu verschlüsselnden Daten zu übergeben. 3. Nennen Sie die Methode .Digest (), um ein Hash -Byte -Array zu erhalten. 4. Umwandeln Sie das Byte -Array in eine hexadezimale Zeichenfolge zum Lesen; Lesen Sie für Eingaben wie gro?e Dateien in Stücken und rufen Sie .update () mehrmals auf. Es wird empfohlen, SHA-256 anstelle von MD5 oder SHA-1 zu verwenden, um die Sicherheit zu gew?hrleisten.

Verwenden Sie zun?chst JavaScript, um die Einstellungen für Benutzersysteme und lokal gespeicherte Themeneinstellungen zu erhalten und das Seitenthema zu initialisieren. 1. Die HTML -Struktur enth?lt eine Schaltfl?che zum Ausl?sen von Themenwechsel. 2. CSS verwendet: root, um helle Themenvariablen zu definieren, .Dark-Mode-Klasse definiert dunkle Themenvariablen und wendet diese Variablen über var () an. 3.. JavaScript erkennt bevorzuge-farbige Scheme und liest LocalStorage, um das ursprüngliche Thema zu bestimmen. 4. Schalten Sie die Dark-Mode-Klasse im HTML-Element beim Klicken auf die Schaltfl?che und speichern Sie den aktuellen Status vor LocalStorage. 5. Alle Farb?nderungen werden mit einer übergangsanimation von 0,3 Sekunden begleitet, um den Benutzer zu verbessern

Ja, ein gemeinsames CSS-Dropdown-Menü kann mit reinem HTML und CSS ohne JavaScript implementiert werden. 1. Verwenden Sie verschachtelte UL und Li, um eine Menüstruktur zu erstellen. 2. Verwenden Sie die: Hover Pseudo-Klasse, um die Anzeige und das Verstecken von Pulldown-Inhalten zu steuern. 3.. Setzen Sie Position: Relativ für Eltern -Li, und das Untermenü wird unter Verwendung von Position positioniert: absolut; 4. Das untergeordnete Standards ist angezeigt: Keine, die angezeigt wird: Block, wenn sie schwebend sind; 5. Multi-Level-Pulldown kann durch Verschachtelung, kombiniert mit dem übergang und Fade-In-Animationen erzielt und an mobile Terminals mit Medienabfragen angepasst werden. Die gesamte L?sung ist einfach und erfordert keine JavaScript -Unterstützung, was für gro?e geeignet ist

Die Datei "Settings.JSON" befindet sich auf dem Pfad auf Benutzerebene oder Arbeitsbereichsebene und wird verwendet, um die VSCODE-Einstellungen anzupassen. 1. Benutzer-Level-Pfad: Windows ist C: \ Benutzer \\ AppData \ Roaming \ Code \ User \ Settings.json, MacOS is /users//library/applicationsupport/code/user/settings.json, Linux is /home/.config/code/usser/setings.json; 2. Pfad auf Arbeitsbereichsebene: .VSCODE/Einstellungen im Projekt Root Directory

Verwenden Sie datetime.strptime (), um Datumszeichenfolgen in DateTime -Objekt umzuwandeln. 1. Grundnutzung: Analyse "2023-10-05" als DateTime-Objekt über "%y-%M-%d"; 2. unterstützt mehrere Formate wie "%M/%d/%y", um amerikanische Daten zu analysieren, "%d/%m/%y", um britische Daten zu analysieren ",%b%d,%y%i:%m%p", um die Zeit mit AM/PM zu analysieren; 3.. Verwenden Sie DateUtil.Parser.Parse (), um unbekannte Formate automatisch zu schlie?en; 4. Verwenden Sie .D

Durch die Installation des EMMET-Plug-Ins k?nnen Sie das intelligente automatische Schlie?en von Tags erreichen und die Abkürzungssyntax unterstützen. 2. Aktivieren Sie "auto_match_enabled": true, damit Sublime einfache Tags automatisch vervollst?ndigen kann. 3. Verwenden Sie Alt. (Gewinn) oder Strg -Verschiebung. (MAC) Verknüpfungsschlüssel zum manuellen Schlie?en des aktuellen Tags - Es wird empfohlen, Emmet im t?glichen Leben zu verwenden. Die beiden letztgenannten Methoden k?nnen kombiniert werden, was effizient und einfach eingestellt ist.
