关于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 两者操作的是同一块数据。