我的源代码在此,可为什么运行总是出错,
import java.util.*;class book{}public class t22{
public static void main(String[] args){
book[] nclass=new book[10];
for(int i=0;i<10;i++){
nclass[i]=new book();
}
Collection nlist=new ArrayList();
for(int i=0;i<nclass.length;i++)
nlist.add(nclass[i]);
System.out.println(nlist);
Collection nlist2=new ArrayList();
nlist2=((List)nlist).subList(2,6);
System.out.println(nlist2);
nlist.addAll(nlist2);
System.out.println(nlist);
nlist.removeAll(nlist2);//???在这里总是出错,
System.out.println(nlist);
}
}麻烦各位高手解决一下!

解决方案 »

  1.   

    nlist.removeAll(nlist2);//???在这里总是出错,会抛出java.util.ConcurrentModificationException 的运行时异常因为你不能在这里进行这样的操作,自己看看API
      

  2.   

    nlist.remove(nlist2);//改成这样吧
      

  3.   

    为什么我不能在这里操作,其实改成这样nlist.remove(nlist2);//
    还是没有预期的效果,我想从集合nlist中删除nlist2集合中的全部对象。
      

  4.   

    nlist2=((List)nlist).subList(2,6);
    关键问题是在这一句,好像是涉及到迭代操作的同步问题,具体原因我也没太整明白.似乎是说这句已经对nlist进行操作,就不能再对nlist操作了,否则会冲突.
    改成下面的语句就正常了:
    for (int i = 2; i < 6; i++)
    nlist2.add(nclass[i]);
      

  5.   

    因为 subList只是返回一个视图,其实数据还是原来的List
    所以如果你要同时返回这两个List(实现上是一个)就会出现并发错误!
      

  6.   

    addAll()为什么不先clone一下呢?
      

  7.   

    总结下::::
    问题只是用另外一种方法解决:
    1。这里的subList其实只是返回一个视图(如旗鲁特说的 )。故出如里修改同同则会出现:java.util.ConcurrentModificationException 
    2。于是只有用(冷血动物说的 )另外做一个List,其中的对象是一样的,但却属于不同的空间,removeAll可以实现。
    3。(我以我血荐轩辕) 的方法我试了,我就是怎么都clone 不了。总是有异常。