Java实现深拷贝List、Map工具类

前言

在Java编程中,我们经常会遇到需要复制List或Map的情况。然而,直接使用赋值操作符进行复制只会复制引用,而不是真正的深拷贝。因此,我们需要实现一个工具类来实现深拷贝List和Map,以确保复制的对象是独立的。

深拷贝的概念

深拷贝(Deep Copy)是指创建一个新的对象,然后将原始对象的非基本类型成员都复制到新对象中,而不是简单地复制引用。

与深拷贝相对的是浅拷贝(Shallow Copy),它只是复制对象的引用,而不复制引用指向的对象。这意味着,如果修改了原始对象中的非基本类型成员,那么拷贝后的对象也会受到影响。

实现深拷贝List

下面是一个简单的工具类,用于实现深拷贝List:

import java.util.ArrayList;
import java.util.List;

public class DeepCopyUtils {

    public static <T> List<T> deepCopyList(List<T> original) {
        List<T> copy = new ArrayList<>(original.size());
        
        for (T item : original) {
            if (item instanceof Cloneable) {
                try {
                    T clonedItem = (T) item.getClass().getMethod("clone").invoke(item);
                    copy.add(clonedItem);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } else {
                copy.add(item);
            }
        }
        
        return copy;
    }
}

该工具类的deepCopyList方法会遍历原始List中的每个元素,如果元素实现了Cloneable接口,则调用其clone方法进行深拷贝,否则直接将元素添加到新的List中。

需要注意的是,要实现深拷贝,元素必须实现Cloneable接口,并且实现其clone方法。

实现深拷贝Map

下面是一个类似的工具类,用于实现深拷贝Map:

import java.util.HashMap;
import java.util.Map;

public class DeepCopyUtils {

    public static <K, V> Map<K, V> deepCopyMap(Map<K, V> original) {
        Map<K, V> copy = new HashMap<>(original.size());
        
        for (Map.Entry<K, V> entry : original.entrySet()) {
            K key = entry.getKey();
            V value = entry.getValue();
            
            if (value instanceof Cloneable) {
                try {
                    V clonedValue = (V) value.getClass().getMethod("clone").invoke(value);
                    copy.put(key, clonedValue);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } else {
                copy.put(key, value);
            }
        }
        
        return copy;
    }
}

该工具类的deepCopyMap方法会遍历原始Map中的每个键值对,如果值实现了Cloneable接口,则调用其clone方法进行深拷贝,否则直接将键值对添加到新的Map中。

同样地,要实现深拷贝,值必须实现Cloneable接口,并且实现其clone方法。

使用示例

下面是一个使用示例,展示如何使用上述工具类进行深拷贝:

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
        List<String> originalList = new ArrayList<>();
        originalList.add("item1");
        originalList.add("item2");
        
        Map<String, Integer> originalMap = new HashMap<>();
        originalMap.put("key1", 1);
        originalMap.put("key2", 2);
        
        // 深拷贝List和Map
        List<String> copyList = DeepCopyUtils.deepCopyList(originalList);
        Map<String, Integer> copyMap = DeepCopyUtils.deepCopyMap(originalMap);
        
        // 修改原始List和Map
        originalList.add("item3");
        originalMap.put("key3", 3);
        
        // 输出结果
        System.out.println("Original List: " + originalList);
        System.out.println("Copy List: " + copyList);
        System.out.println("Original Map: " + originalMap);
        System.out.println("Copy Map: " + copyMap);
    }
}
``