注意:所有的复制分普通list(list<String>)和集合对象list<Dept> 一般的工具都对集合对象是浅拷贝,对象会跟着变

java Collections.copy的使用(浅拷贝)

Collections.copy(list1, list),第一个是目标集合,第二个是源集合

拷贝一个ArrayList对象到另一个ArrayList对象中,正好发现Collections有一个copy方法。可是不好用啊总是报错。查看api才知道,
它的capacity(容纳能力大小)可以指定(最好指定)。而初始化时size的大小永远默认为0,只有在进行add和remove等相关操作 时,
size的大小才变化。然而进行copy()时候,首先做的是将desc的size和src的size大小进行比较,只有当desc的 size 大于或者等于
src的size时才进行拷贝,否则抛出IndexOutOfBoundsException异常;

所以新的目标集合在创建的时候一定要定义长度,长度一定要大于或者等于源集合

//尖括号里的是什么后面就是new 什么,其它不变,或者可以设置为new Object
List<BaseDept> list1=new ArrayList<BaseDept>(Arrays.asList(new BaseDept[list.size()]));

第二种,用集合对象的话就是浅拷贝,普通list就是深拷贝
List<String> list1=   new  ArrayList<String>();
  Collections.addAll(list1,  new  String[list.size()]);
 // CollectionUtils.addAll(list1,  new  String[list.size()]);//也是一样的
 //但是要import org.apache.commons.collections.CollectionUtils;这个包
  Collections.copy(dest1, src);

BeanUtils.copyProperties(浅复制),且不能复制集合和数组

import org.springframework.beans.BeanUtils;导入的包是这个

BeanUtils.copyProperties(user1,user2);
//注意是前面的对象赋值到后面的对象
BeanUtils.copyProperties只对bean属性进行复制,这里的复制属于浅复制。BeanUtils.copyProperties利用反射,直接将对象的引用set进去,并不是深拷贝。
//list集合也可以
List<Dailyfill> list = dailyfillService.list();
		List<DailyfillExcel> list1=new ArrayList<>();
		BeanUtils.copyProperties(list,list1);//复制集合没用,只能对象

List的复制 (浅拷贝与深拷贝)

开门见山的说,List的复制其实是很常见的,List其本质就是数组,而其存储的形式是地址

java list 深度拷贝 java copylist_java list 深度拷贝

如图所示,将List A列表复制时,其实相当于A的内容复制给了B,java中相同内容的数组指向同一地址,即进行浅拷贝后A与B指向同一地址。

造成的后果就是,改变B的同时也会改变A,因为改变B就是改变B所指向地址的内容,由于A也指向同一地址,所以A与B一起改变。

这也就是List的浅拷贝,其常见的实现方式有如下几种:

浅拷贝

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);

List 深拷贝

java list 深度拷贝 java copylist_浅拷贝_02


如图,深拷贝就是将A复制给B的同时,给B创建新的地址,再将地址A的内容传递到地址B。ListA与ListB内容一致,但是由于所指向的地址不同,所以改变相互不受影响

1,转成json进行深拷贝

通过以下方式解决复制List、Map

public static <T> List copyList(List<T> list) {
    if (CollectionUtils.isEmpty(list)) {
        return new ArrayList();
    }
    return JSON.parseArray(JSON.toJSONString(list), list.get(0).getClass());
}

public static Map<String, Object> copyMap(Map map) {
    return JSON.parseObject(JSON.toJSONString(map));
}