import java.util.*;class A{
private static int counter;
private int count = counter++;
public String toString(){
return ("A : " + count);
}

class Test{
public static void main(String[] args){
A[] a = new A[10];
for(int i = 0;i < a.length;i ++)
a[i] = new A();
List<A> list  = new ArrayList<A>(Arrays.asList(a));
System.out.println("list = " + list);
List<A> sublist = list.subList(list.size() / 4, list.size() / 2);
System.out.println("sublist = " + sublist);
list.removeAll(sublist); //为什么会出现异常???
sublist.clear(); //这里是对sublist进行clear,怎么会影响到最后list的输出呢??
System.out.println("finally : " + list);
}
}由上述注释所示。好纠结啊

解决方案 »

  1.   

    你打开sublist的源码,有注释的
    /**The returned list is backed by this list, so non-structural
         * changes in the returned list are reflected in this list, and vice-versa.
         * The returned list supports all of the optional list operations supported
         * by this list.<p>/ , 修改sublist能影响到list
      

  2.   

    这边会出现异常的原因是你的着两个方法起冲突了。list.removeAll(sublist);
    sublist.clear();1.看api:boolean removeAll(Collection<?> c)从列表中移除指定 collection 中包含的其所有元素(可选操作)。 
    2.执行完removeall()完,sublist就为空了,编译器抛出(运行修改异常)ConcurrentModificationException
      

  3.   

    为什么我觉得上面两位还是没有讲到核心问题。昨天,我又试了好多次,我发现了下面的问题,不知道自己的理解是否正确,麻烦大神看下
    import java.util.*;class A{
    private static int counter;
    private int count = counter++;
    public String toString(){
    return ("A : " + count);
    }

    class aiqing{
    public static void main(String[] args){
    A[] a = new A[10];
    for(int i = 0;i < a.length;i ++)
    a[i] = new A();
    List<A> lists  = new ArrayList<A>(Arrays.asList(a));
    System.out.println("list = " + lists);
    //sublist并不是将lists分片之后在进行复制一份,而是直接在list的位置进行操作,即sublist并不是一个真正的对象
    List<A> sublist = lists.subList(lists.size() / 4, lists.size() / 2);
    System.out.println("sublist = " + sublist);
    sublist.add(new A());
    //因此,当执行add操作后,list的值也将受到影响
    System.out.println("sublist add : " + lists);
    //lists.removeAll(sublist); //因此这里会出现ConcurrentModificationException异常,因为你此时操作的对象一直是list
    //同理,下面的操作也会影响到lists的值。
    sublist.clear();
    System.out.println("finally : " + lists);
    }
    }