Collections.copy()

今天在用Collections.copy()复制集合的时候出来了个问题:
java.lang.indexOutOfBoundsException:Source does not fit in dest
很明白的知道是因为什么意思,可是不知道原理究竟为什么会这样,
	List<Demo> list1=new ArrayList<Demo>();
		Demo demo = new Demo();
		demo.setName("aa");
		demo.setCode("01");
		Demo demo1 = new Demo();
		demo1.setName("bb");
		demo1.setCode("02");
		list1.add(demo);
		list1.add(demo1);
		List<Demo> lists = new ArrayList<Demo>();
		Collections.copy(lists, list1);

就报了上面的错误
List<Object> dest=new ArrayList<Object>(src.size());  
//or List<Object> dest=new ArrayList<Object>();  
Collections.copy(dest, src());  

按如上方式用时,很容易得到"Source does not fit in dest" Exception,原因是copy方法里面会首先比较dest和src的size,而往往你新new的list的size是0,所以会报错。
为什么明明已经设置了长度为src.size,为什么还会出错!
后来打印出dest.size()才知道dest的长度为0,new ArrayList<Object>(src.size())表示的是这个List的容纳能力为src.size,并不是说dest中就有了src.size个元素。查看api才知 道,它的capacity(容纳能力大小)可以指定(最好指定)。而初始化时size的大小永远默认为0,只有在进行add和remove等相关操作 时,size的大小才变化。然而进行copy()时候,首先做的是将desc1的size和src1的size大小进行比较,只有当desc1的 size 大于或者等于src1的size时才进行拷贝,否则抛出IndexOutOfBoundsException异常。

可以通过下面的方法指定目标desc的大小
List<Object> values=new ArrayList<Object>(Arrays.asList(new Object[srcList.size()]));  
Collections.copy(values, srcList());  


在这里很感谢http://darrenzhu.iteye.com/blog/1642672的博客,从他的博文上面了解到了机制和原理,后面终于解决了问题

你可能感兴趣的:(java)