Copie profonde et copie superficielle de Java-List<Map>

L’arrière-plan du blog est le développement Java. Parlons de la copie profonde et de la copie superficielle dans la copie List<Map>.

1. Copie superficielle

À l'exception du type de base de Map, qui est transmis par valeur, le reste est transmis par adresse de référence.
Puisque l'adresse de référence du stockage des valeurs de la carte est transmise (liste), lorsque les propriétés internes de l'objet de liste changent, la valeur dans la carte change en conséquence. Cette méthode est une copie superficielle.

Par exemple : list1 est copié superficiellement dans list2. Les tableaux avec le même contenu en Java pointent vers la même adresse, c'est-à-dire que list1 et list2 après une copie superficielle pointent vers la même adresse. L'impact de ceci est que si list2 est modifié, list1 sera également modifié. Parce que changer list2 signifie changer le contenu de l'adresse vers laquelle elle pointe, et list1 pointe également vers la même adresse, donc list1 et list2 changeront ensemble.

Dans l'exemple de code suivant, il existe trois façons d'implémenter une copie superficielle :

1.1 Copie de parcours de boucle

//方法一:循环遍历复制
List<Map<String, Object>> list2 = new ArrayList<>(list1.size());
for (Map<String, Object> map : list1) {
    
    
    listt2.add(map);
}

1.2 Utiliser list pour implémenter le constructeur d'une classe

//方法二:使用list实现类的构造方法
List<Map<String, Object>> list2 = new ArrayList<>(list1);

1.3Méthode addAll

//方法三:使用addAll
List<Map<String, Object>> list2 = new ArrayList<>();
list2.addAll(list1);

2. Copie approfondie

Si vous ne souhaitez pas modifier la valeur dans la carte d'origine, vous pouvez utiliser le principe de réflexion pour effectuer un traitement de copie approfondie. Le principe est d'ouvrir une nouvelle adresse mémoire dans la mémoire, ainsi la valeur à l'ancienne adresse ne sera pas modifiée.

Par exemple, la copie complète copie list1 vers list2, crée une nouvelle adresse pour list2, puis transfère le contenu de l'adresse list1 vers l'adresse list2. Cela rendra le contenu de list1 et list2 cohérent, mais comme ils pointent vers des adresses différentes, les modifications ne s'affecteront pas.

Classe d'outils de copie profonde SerializationUtils.clone

commons-lang-2.6.jar
例如:Object obj = SerializationUtils.clone( objectFrom )

L'exemple de code est le suivant, implémenté à l'aide de la classe d'outils de copie approfondie

List<HashMap<String, Object>> list2 = new ArrayList<>();
for (Map<String, Object> hashMap : list1) {
    
    
    list2.add((HashMap<String, Object>) SerializationUtils.clone((Serializable) hashMap));
}

Référence :
https://blog.csdn.net/VIP099/article/details/108633345
https://blog.csdn.net/shy415502155/article/details/106048557/

Je suppose que tu aimes

Origine blog.csdn.net/weixin_44436677/article/details/132916180
conseillé
Classement