黑马程序员技术交流社区

标题: copy集合疑问 [打印本页]

作者: 庄星睿    时间: 2012-7-18 10:12
标题: copy集合疑问
Collections工具类里提供了copy方法,能够将集合中的元素复制到另一个集合


public static void  copyDemo()
{
  List<String> list=new ArrayList<>();
  list.add("abccd");
  list.add("aa");
  list.add("b");
  list.add("z");
  list.add("bcd");
  list.add("bcde3");
  sop(list);
  List<String> newlist=new ArrayList<>();
  //newlist.add("test"); //这里 必须添加到六个以上的元素才可以。
  Collections.copy(newlist,list);
  sop(newlist);
  sop(newlist.size());

}

API 里注释
将所有元素从一个列表复制到另一个列表。执行此操作后,目标列表中每个已复制元素的索引将等同于源列表中该元素的索引。目标列表的长度至少必须等于源列表。如果目标列表更长一些,也不会影响目标列表中的其余元素。

但直接复制会报数组下标溢出,ArrayList集合在初始化的时候不是默认分配了容量为 10 的空列表吗?

作者: 温少邦    时间: 2012-7-18 11:48
ArrayList在初始化时是创建了一个大小为10的数组
但是Collection的copy方法为了兼容各种集合
是通过迭代器来实现的遍历

当目标集合的size小于源集合的size时
迭代至目标集合已经没有元素,但是源集合的迭代器还在进行迭代
所以同样会调用目标集合的迭代器的next()方法,
就会抛出NoSuchElementException

所以copy方法上来就检测目标集合的size是否小于源集合的size
如果是的话,就直接抛出IndexOutOfBoundsException




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2