注意:所有的复制分普通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其本质就是数组,而其存储的形式是地址
如图所示,将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 深拷贝
如图,深拷贝就是将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));
}