Map深拷贝和对象深拷贝实现

所谓深拷贝就是将源对象克隆了一份保存在内存中,后续对复制的对象所有操作都不会影响源对象。

因为Map的putAll()的拷贝方式实现的是浅拷贝,所以后续对复制对象操作会影响到源对象。

在java中,对象的赋值都是对象引用,相当于直接使用了内存中使用了同一个对象。

下面我们直接看实现代码:

public class CloneUtils {
     
	
	/**
	 * 深度复制对象,该对象必须实现Serializable接口
	 * @param 
	 * @param srcObj
	 * @return
	 */
	public static <T extends Serializable> T cloneObj(T srcObj) {
     
		T cloneObj = null;
        try {
     
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(bos);
            oos.writeObject(srcObj);
            oos.close();

            ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
            ObjectInputStream ois = new ObjectInputStream(bis);
            cloneObj = (T) ois.readObject();
            ois.close();
        } catch (Exception e) {
     
            System.out.println("克隆对象出现异常。");
        }
        return cloneObj;
	}

	/**
	 * 深度复制Map
	 * @param 
	 * @param 
	 * @param srcMap
	 * @return
	 */
	public static <T, V> Map<T, V> cloneMap(Map<T, V> srcMap) {
     
		Map<T, V> cloneMap = new HashMap<T, V>();
		for(Map.Entry<T, V> entry : srcMap.entrySet()) {
     
			cloneMap.put(entry.getKey(), entry.getValue());
		}
		return cloneMap;
	}
}

你可能感兴趣的:(java,utils工具,hashmap)