0
点赞
收藏
分享

微信扫一扫

java中集合进行深拷贝

天涯学馆 04-10 16:30 阅读 1

深拷贝和浅拷贝是Java中复制对象的两种方式。

  1. 浅拷贝:浅拷贝是指创建一个新对象,然后将原对象的非静态成员变量的引用复制到新对象中。这样,新对象和原对象的成员变量指向同一个内存地址。如果成员变量是基本数据类型,那么它们的值会被复制;如果成员变量是引用类型,那么它们的引用会被复制,但引用的对象不会被复制。这意味着对新对象的修改可能会影响到原对象。
  2. 深拷贝:深拷贝是指创建一个新对象,并将原对象的所有成员变量(包括基本数据类型和引用类型)都复制到新对象中。这样,新对象和原对象的成员变量指向不同的内存地址。深拷贝需要实现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>集合的深拷贝,可以使用以下方法:

  1. 遍历原始List集合,对每个Map进行深拷贝。
  2. 对每个Map进行深拷贝时,需要创建一个新的Map对象,并将原始Map中的键值对逐个复制到新的Map中。对于值是基本数据类型或String类型的键值对,直接复制值;对于值是引用类型(如List、Set、Object等)的键值对,需要进行递归深拷贝。
  3. 将深拷贝后的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对象的深拷贝。

举报

相关推荐

0 条评论