深拷贝和浅拷贝是Java中复制对象的两种方式。
- 浅拷贝:浅拷贝是指创建一个新对象,然后将原对象的非静态成员变量的引用复制到新对象中。这样,新对象和原对象的成员变量指向同一个内存地址。如果成员变量是基本数据类型,那么它们的值会被复制;如果成员变量是引用类型,那么它们的引用会被复制,但引用的对象不会被复制。这意味着对新对象的修改可能会影响到原对象。
- 深拷贝:深拷贝是指创建一个新对象,并将原对象的所有成员变量(包括基本数据类型和引用类型)都复制到新对象中。这样,新对象和原对象的成员变量指向不同的内存地址。深拷贝需要实现Cloneable接口并重写clone()方法。
在Java开发中,有时候我们为了源List集合的数据不被修改,如果采用类似“new_list = old_list”这种形式来复制克隆一个新的List集合是绝对不行的(地址引用)
1)这里举个简单例子引入下核心内容,List 集合内若都是基本数据类型的值,那我们可以采用下面的几种方法来复制一个新的List集合,其实核心就是要new 一个新的list对象出来。
importjava.util.ArrayList;
importjava.util.Arrays;
importjava.util.List;
importjava.util.stream.Collectors;
//ProgramtocloneaListinJava
classExample{
public static void main(String[]args){
//Createalist
Listoriginal
=Arrays.asList(
“GeeksForGeeks”,
“AComputerScience”,
“Portal”);
//Clonealist
//1.通过Java 8的Streams方法来克隆复制一个新的List集合
List cloned_list1 =original.stream() .collect(Collectors.toList());
//2.Java中克隆复制一个List可以在创建List对象时通过将源List集合以参数的形式传入即可
List cloned_list =new ArrayList(original);
//3.通过List集合的addAll()方法复制克隆一个新的List集合
List cloned_list2 = new ArrayList();
cloned_list.addAll(original);
System.out.println(cloned_list1);
}
上述克隆复制出一个新的List集合cloned_list对象,输出结果如下:[GeeksForGeeks,AComputerScience,Portal]
2)若List集合内是引用类型的数据,需要逐层级的对引用类型的数据进行深拷贝,
这里举个例子,其他引用类型、自定义类型的同理,比如要实现List<Map>集合的深拷贝,可以使用以下方法:
- 遍历原始List集合,对每个Map进行深拷贝。
- 对每个Map进行深拷贝时,需要创建一个新的Map对象,并将原始Map中的键值对逐个复制到新的Map中。对于值是基本数据类型或String类型的键值对,直接复制值;对于值是引用类型(如List、Set、Object等)的键值对,需要进行递归深拷贝。
- 将深拷贝后的Map添加到新的List集合中。
以下是一个简单的示例:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class DeepCopyExample {
public static void main(String[] args) {
List<Map<String, Object>> originalList = new ArrayList<>();
Map<String, Object> map1 = new HashMap<>();
map1.put("name", "张三");
map1.put("age", 20);
originalList.add(map1);
List<Map<String, Object>> copiedList = deepCopyList(originalList);
System.out.println("Original List: " + originalList);
System.out.println("Copied List: " + copiedList);
}
public static List<Map<String, Object>> deepCopyList(List<Map<String, Object>> originalList) {
List<Map<String, Object>> copiedList = new ArrayList<>();
for (Map<String, Object> originalMap : originalList) {
Map<String, Object> copiedMap = new HashMap<>();
for (Map.Entry<String, Object> entry : originalMap.entrySet()) {
String key = entry.getKey();
Object value = entry.getValue();
if (value instanceof List) {
copiedMap.put(key, deepCopyList((List<Map<String, Object>>) value));
} else if (value instanceof Map) {
copiedMap.put(key, deepCopyMap((Map<String, Object>) value));
} else {
copiedMap.put(key, value);
}
}
copiedList.add(copiedMap);
}
return copiedList;
}
public static Map<String, Object> deepCopyMap(Map<String, Object> originalMap) {
Map<String, Object> copiedMap = new HashMap<>();
for (Map.Entry<String, Object> entry : originalMap.entrySet()) {
String key = entry.getKey();
Object value = entry.getValue();
if (value instanceof List) {
copiedMap.put(key, deepCopyList((List<Map<String, Object>>) value));
} else if (value instanceof Map) {
copiedMap.put(key, deepCopyMap((Map<String, Object>) value));
} else {
copiedMap.put(key, value);
}
}
return copiedMap;
}
}
在这个示例中,deepCopyList()
方法实现了List集合的深拷贝,deepCopyMap()
方法实现了Map对象的深拷贝。