Cet article décrit la fonction de réplication profonde de Java et l'utilisation. Partagez-le pour votre référence, comme suit:
Écrit avant:
Qu'est-ce que la réplication profonde? En Java, lors de la création d'un objet, nous avons généralement une référence pointant vers l'objet. Lorsque nous modifions la valeur (propriétés) de l'objet en se référant à la variable, la référence reste inchangée et elle modifie la mémoire dans la mémoire, c'est-à-dire l'objet pointé. D'une manière générale, lorsque nous attribuons cette référence à une autre variable de référence ou la transmet en tant que paramètre, nous ne le faisons que, c'est-à-dire que nous pointé la référence pour "copier" une copie dans une autre variable de référence, puis la variable de référence pointe également vers le même objet, et aucun nouvel objet n'est créé en mémoire. Dans certains cas, nous devons "vraiment copier" l'objet, créer une copie de l'objet connu, pas seulement "copier" la référence, qu'il s'agisse d'une sauvegarde ou d'autres opérations.
Alors, comment y parvenir?
Parlons d'abord de l'idée: d'abord sérialiser l'objet dans le flux, puis de le désérialiser et de le lire depuis le flux.
Le code suivant:
Package com.yo.java; import java.io.bytearrayinputStream; import java.io.bytearrayoutputStream; import java.io.ioexception; import java.io.objectInputstream; import java.io.objectoutputStream; import java.io.serializable; import java.utitil.arraylist; import; java.util.list; / ** * Java implémente la copie profonde * @author yo * * / public class DeepCopy implémente serializable {int i; / ** * @param args * @throws ioException * @throws classNotFoundException * / public static void main (String [] args) lève ClassNotFoundException, ioException {Demo1 (); Demo2 (); } / ** * Copie profonde, la classe de paramètres réelle doit implémenter l'interface sérialisable * @param o * @return * @throws ioException * @throws classnotfoundException * / public static objet DeepCopy (objet o) lance ioException, classNotfoundException {// // serialize First and Write to the StreamPutSeTPUTPUTSTRESTREAM BO = nouveau byTayout ();); ObjectOutputStream oo = new ObjectOutputStream (bo); oo.writeObject (o); // désérialiser et lire ensuite le flux, c'est-à-dire en copie ByteArrayInputStream bi = new ByteArrayInputStream (bo.toByTearray ()); ObjectInputStream oi = new ObjectInputStream (BI); return oi.readObject (); } / ** * Référence Passe et copie profonde * @throws classNotFoundException * @throws ioException * / public static void Demo1 () lève ClassNotFoundException, ioException { System.out.println("========================================================================================== ============================================================================================================================. ============================================================================================================================. =============================================================================================================================. 1; // Initialise la valeur de I dans DC1 Deepcopy DC2 = DC1; System.out.println("===================================================================================== ===========================================================================================================. ==========================================================================================================. ===========================================================================================================. (DeepCopy) DeepCopy (DC3); void Demo2 () lève ClassNotFoundException, iOException {System.out.println ("=========================================================================================================. System. Out of System. System. Out of System. System. Out of System. System. Out of System. System. Out of System. System. Out of System. System. System. Out of System. System. System. Out of System. System. System. Out of System. System. System. Out of System. System. System. Out of System. System. System. Out of System. System. System. Out of System. System. System. System. Out of System. System. System. System. Out of System. System. System. System. Out of System. System. System. System. Out of System. System. System. System. Out of System. System. System. System. System. Out of System. System. System. System. System. System. Out of System. System. System. System. System. System. Out of System. System. System. System. System. System. System. System. Out of System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System src) The result is the same //Change the value of the element in list1 for(DeepCopy d1 : list1) { //Change the value of i in dc1 d1.i = 2; } // LISTE DE TRANSIPE pour (DeepCopy D1: List1) {System.out.println ("List1:" + D1.i);} // Transip List2 pour (DeepCopy D2: List2); System.out.println("======================================================================== =================================================================================================. =================================================================================================. =================================================================================================. New DeepCopy (); D3: list3) {System.out.println ("list3:" + d3.i);} pour (deepcopy d4: list4) {System.out.println ("list4 (copie profonde):" + d4.i);Les résultats de l'opération ci-dessus sont les suivants (réellement mesurés):
=================================================================================================================================. =================================================================================================================================. =================================================================================================================================. ===================================================================================================================================. : 2List4 (copie profonde): 1
On peut voir que lorsqu'il se référait à passer ou à créer une nouvelle valeur basée sur la valeur de l'objet, il ne peut être appelé que "copie superficielle". Lorsque les propriétés de l'objet d'origine changent, les propriétés du nouvel objet créées en fonction de la méthode ci-dessus changent également en conséquence; Et si une copie profonde est utilisée, il est vrai qu'un nouvel objet est copié. Le nouvel objet n'a aucune relation avec l'objet d'origine. Le changement des propriétés de l'objet d'origine n'affectera pas le nouvel objet, tout comme la signification de la copie.
Comme mentionné ci-dessus, s'il y a une inappropriation, si vous pouvez le signaler, merci beaucoup
Pour plus de contenu lié à Java, les lecteurs qui sont intéressés par ce site peuvent afficher les sujets: "Tutoriel de structure de données Java et d'algorithme", "Résumé des conseils de nœud de Dom Operation Java", "Résumé du fichier Java et des conseils d'opération de répertoire" et "Résumé des conseils d'opération Java Cache"
J'espère que cet article sera utile à la programmation Java de tous.