深拷贝工具类DeepCopyUtil

深拷贝工具类DeepCopyUtil


GitHub: link. 欢迎star

import lombok.extern.slf4j.Slf4j;

import java.io.*;
import java.util.List;

/**
 * @author Andon
 * 2021/11/10
 * <p>
 * 深拷贝
 */
@SuppressWarnings({"unchecked", "Duplicates"})
@Slf4j
public class DeepCopyUtil {

    /**
     * List深拷贝 条件:需要model实现Serializable
     */
    public static <T> List<T> deepCopy(List<T> t) {
        try {
            // 写入字节流
            ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
            ObjectOutputStream out = new ObjectOutputStream(byteOut);
            out.writeObject(t);

            ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
            ObjectInputStream in = new ObjectInputStream(byteIn);
            return (List<T>) in.readObject();
        } catch (IOException | ClassNotFoundException e) {
            log.info("deepCopy failure!! error={}", e.getMessage());
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 对象深拷贝 条件:需要model实现Serializable
     */
    public static <T> T deepCopy(T t) {
        try {
            // 写入字节流
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(baos);
            oos.writeObject(t);

            ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
            ObjectInputStream ois = new ObjectInputStream(bais);
            return (T) ois.readObject();
        } catch (IOException | ClassNotFoundException e) {
            log.info("deepCopy failure!! error={}", e.getMessage());
            e.printStackTrace();
            return null;
        }
    }
}

GitHub: link. 欢迎star

### 回答1: Java中实现深拷贝需要考虑到对象的序列化和反序列化,下面是一个使用Java序列化实现深拷贝工具类代码示例: ``` import java.io.*; public class DeepCopyUtil { public static <T extends Serializable> T deepCopy(T obj) throws IOException, ClassNotFoundException { ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(obj); ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bis); return (T) ois.readObject(); } } ``` 使用示例: ``` public class Main { public static void main(String[] args) throws IOException, ClassNotFoundException { List<Integer> list1 = new ArrayList<>(); list1.add(1); list1.add(2); list1.add(3); List<Integer> list2 = DeepCopyUtil.deepCopy(list1); System.out.println("list1 == list2: " + (list1 == list2)); // false System.out.println("list1.equals(list2): " + list1.equals(list2)); // true } } ``` 该工具类使用了Java的序列化和反序列化,通过将对象序列化成字节数组,再反序列化成新的对象,从而实现了深拷贝。需要注意的是,被复制的对象必须是可序列化的。 ### 回答2: Java中的深拷贝工具类主要用于在创建对象副本时,将对象的所有属性值及其相关的对象也进行拷贝,从而保证新对象的独立性。实现深拷贝的常用方法有两种:序列化与反序列化、自定义深拷贝方法。 首先,使用序列化与反序列化可以实现深拷贝。通过将对象写入流并从流中读取,可以获得该对象的副本。首先,将对象写入OutputStream,再通过ByteArrayInputStream将流转化为字节数组。然后,通过ObjectInputStream将字节数组转化为对象并返回。 其次,可以自定义深拷贝方法。该方法通过递归遍历对象的所有属性,对每个属性实施拷贝操作。如果属性为基本类型,则直接拷贝;如果为引用类型,则递归进行深拷贝。这样可以确保新对象的每个属性都是独立的。 需要注意的是,在使用自定义深拷贝方法时,需要手动实现所有需要拷贝的属性的拷贝逻辑。如果对象的属性过多或复杂,手动实现深拷贝可能会较为繁琐。 综上所述,Java中的深拷贝工具类可以通过序列化与反序列化或自定义深拷贝方法来实现。根据具体需求和对象属性的复杂程度,可以选择合适的方法来完成对象的深拷贝操作。 ### 回答3: Java深拷贝工具类是一个用于复制对象的工具类深拷贝的概念是指在复制对象时,不仅复制对象本身,还复制对象所引用的其他对象,从而实现完全独立的副本。 在实现深拷贝工具类时,可以通过以下步骤: 1. 首先,需要确保被复制的对象及其引用的对象都实现了Cloneable接口,这样才能使用Object类的clone()方法进行对象的浅拷贝。 2. 创建一个新的空对象,用于存储复制后的对象。 3. 遍历被复制的对象的所有引用类型属性或集合,并逐一进行深拷贝。 4. 对于引用类型属性,可以通过递归调用深拷贝方法,将引用对象复制到新的对象中。 5. 对于集合类型属性,可以创建一个新的集合对象,并将原集合中的每个元素进行深拷贝后添加到新的集合中。 6. 最终返回复制后的对象。 需要注意的是,深拷贝工具类只能完成基本数据类型和引用类型的深拷贝,对于对象内部的静态变量或其他逻辑复杂的情况,需要额外的处理方式。 总之,通过深拷贝工具类,我们可以实现对Java对象及其引用对象的完全独立复制,确保原对象和复制对象之间的数据隔离,适用于需要保护原有数据的场景,如多线程环境下的数据处理。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值