浅层复制与深层复制

几种浅拷贝

1、遍历循环复制

List<Person> destList = new ArrayList<Person>(srcList.size());  
 for(Person p : srcList){  
     destList.add(p);  
 } 

2、使用List实现类的构造方法

List<Person> destList = new ArrayList<Person>(srcList);  

3、使用list.addAll()方法

List<Person> destList = new ArrayList<Person>();  
destList.addAll(srcList); 

4、使用System.arraycopy()方法

Person[] srcPersons=srcList.toArray(new Person[0]); 
Person[] destPersons=new Person[srcPersons.length]; 
System.arraycopy(srcPersons, 0, destPersons, 0, srcPersons.length); 

5、使用Stream的方式copy

List<Person> destList = srcList.stream().collect(Collectors.toList());

深层复制

1.使用序列化方法

/**
     * 对集合进行深拷贝
     * 注意需要岁泛型类进行序列化(实现serializable)
     *
     * @param src
     * @param <T>
     * @return
     * @throws IOException
     * @throws ClassNotFoundException
     */
    public static <T> List<T> deepCopy(List<T> src) {
        try (ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
             ObjectOutputStream outputStream = new ObjectOutputStream(byteOut);
        ) {
            outputStream.writeObject(src);
            try (ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
                 ObjectInputStream inputStream = new ObjectInputStream(byteIn);
            ) {
                return (List<T>) inputStream.readObject();
            }
        } catch (Exception e) {
            ThrowableUtils.getString(e);
        }
        return Collections.emptyList();
    }

注意,bean必须要序列化

2.clone方法

public class A implements Cloneable {
    public String name[];
    public A(){ name=new String[2]; }
    public Object clone() {
        A o = null;
        try {
            o = (A) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        } return o;
    }
}

for(int i=0;i<n;i+=){
    copy.add((A)src.get(i).clone());
}

Java对对象和基本的数据类型的处理是不一样的。在Java中用对象的作为入口参数的传递则缺省为”引用传递”,也就是说仅仅传递了对象的一个”引用”,这个”引用”的概念同C语言中的指针引用是一样的。当函数体内部对输入变量改变时,实质上就是在对这个对象的直接操作。 除了在函数传值的时候是”引用传递”,在任何用”=”向对象变量赋值的时候都是”引用传递”。

主要就是把这个链接超过来了,看别的要导包,要么要RMB,要么复杂还不行,只为记录

java List复制:浅拷贝与深拷贝 - 腾逸 - 博客园Java的拷贝可以分为三种:浅拷贝(Shallow Copy)、深拷贝(Deep Copy)、延迟拷贝(Lazy Copy)。 在java中除了基本数据类型之外(int,long,short等),还存https://www.cnblogs.com/zt007/p/9884712.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值