何隆昌 java list集合克隆,拷贝,复制数据导入到另一个对象

注意:所有的复制分普通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 深拷贝

https://www.cnblogs.com/luxd/p/11933686.html
在这里插入图片描述
如图,深拷贝就是将A复制给B的同时,给B创建新的地址,再将地址A的内容传递到地址B。ListA与ListB内容一致,但是由于所指向的地址不同,所以改变相互不受影响

1,转成json进行深拷贝

通过以下方式解决复制ListMap

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

2,

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值