List list=new ArrayList();
list.add(new Object);
list.add(new Object);
list.add(new Object);
list.removeAll(list.subList(1,2));
大家觉得这段代码会出问题么
谁能解释下具体的原理性的错误在哪,本人猜测是递归问题,但是具体还没想通

解决方案 »

  1.   

    subList和removeAll操作的是同一个对象
      

  2.   


    与此差不多的意思,你不能在迭代一个集合的时候,remove这个集合的对象.
    问题转换:List list=new ArrayList();
    Object o1 = new Object();
    Object o2 = new Object();
    Object o3 = new Object();
    list.add(o1);
    list.add(o2);
    list.add(o3);
    Iterator it = list.iterator();
    while(it.hasNext())
    {
    Object o = it.next();
    list.remove(o);
    }而removerAll中的源代码则是: public boolean removeAll(Collection<?> c) {
    boolean modified = false;
    Iterator<?> e = iterator();
    while (e.hasNext()) {
        if (c.contains(e.next())) {
    e.remove();
    modified = true;
        }
    }
    return modified;
        }所以是不能这样做的,
    改造一下:List list=new ArrayList();
    Object o1 = new Object();
    Object o2 = new Object();
    Object o3 = new Object();
    list.add(o1);
    list.add(o2);
    list.add(o3);
    List list2=new ArrayList();
    list.add(o2);
    list.add(o3);
    list.removeAll(list2);
      

  3.   

    谢谢楼上各位,不管个人感觉还没到G点ist list=new ArrayList();
     Object o1 = new Object(); 
    Object o2 = new Object();
     Object o3 = new Object(); 
    list.add(o1); 
    list.add(o2);
    list.add(o3);
     Iterator it = list.iterator();
     while(it.hasNext()) {
     Object o = it.next();
     // list.remove(o);
    it.remove();//实际上这段代码是可以通过的,it是迭代器的对象
    }
      

  4.   

    看下下面运行结果就知道了
    subList并没有创建新对象,只是原来对象的引用
    所以修改时候造成了并发错误 List list=new ArrayList();
    list.add(new Object());
    list.add(new Object());
    list.add(new Object());
    List subList = list.subList(1,3);

    System.out.println("sublist:[size]"+subList.size());
    System.out.println("list:[size]"+list.size());
    System.out.println(list.get(1));
    System.out.println(subList.get(0));
    System.out.println(list.get(2));
    System.out.println(subList.get(1));
    subList.set(1, new Object());
    System.out.println(list.get(2));
    System.out.println(subList.get(1));
    运行结果:
    sublist:[size]2
    list:[size]3
    java.lang.Object@1fb8ee3
    java.lang.Object@1fb8ee3
    java.lang.Object@61de33
    java.lang.Object@61de33
    java.lang.Object@14318bb
    java.lang.Object@14318bb//修改一个会造成另一个的改动
      

  5.   

    list.removeAll(list.subList(1,2));
    改为:
    list.removeAll(new ArrayList(list.subList(1,2)));
    这样也可以。