关于List的复制问题

缘由

今天开发自助柜面跨行转账时遇到的list的坑,

从Var 中获取list 集合
List<Map<String,String>> mulitilable=var.getDataValueAt("mulitilable");
Iterator it=mulitiable.iterator();
while(it.hasnext()){
   //满足一定条件,则进行删除
	it.remove();
}
`return mulitiable;

**实际需求中**,var的mulitilable 元素的内容是不需要改变的,只需要返回一个删除过一些元素的mulitilable副本进行下一步操作
结果导致,副本是拿到了但是也同时修改了mulitiable 导致出现数据错误
借此机会,总结一下关于list复制的问题

方法一 List newList=new ArrayList<>(oldlist);

List<String> oldList=new ArrayList<String>();
oldList.add("a");
*List<String> newList=new ArrayList<String>(oldList);//会开辟新的内存空间,跟原有的list互不影响*

方法二 newList.addAll(oldList);

List<String> oldList=new ArrayList<String>();
oldList.add("a");
*List<String> newList=new ArrayList<String>();
newList.addAll(oldList);//会开辟新的内存空间,跟原有的list互不影响*

方法三 Collections.copy(dest,src);

List<String> oldList=new ArrayList<String>();
oldList.add("a");
*List<String> newList=new ArrayList(Arrays.asList(new Object[list.size()]));

如果直接使用
Collections.copy(newList,oldListl);
会报错:java.lang.IndexOutOfBoundsException: Source does not fit in dest

原因是你使用该方法时,会先比较目标集合和源集合的size,而你直接new ArrayList();还没来得及复制,目标集合的size为0,和源集合的size不一样,就会报错。注:new ArrayList(int size)定义的是该集合的的容纳能力为size,并不是说目标集合中就有了size个元素。所以要这样写:new ArrayList(Arrays.asList(new Object[oldList.size()]));

方法四 List newList=oldList;

 上面3种创建的新集合跟老集合不会互相影响,第4种方法实现的"复制“只是将newList指向oldList 两者操作的是同一块数据。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值