List l = new ArrayList();
l.add("a");
l.add("b");
l.add("c");
List s = l.subList(0, 2);
l.remove(0);
l.add("d");
System.out.println(s.size());
将会抛出java.util.ConcurrentModificationException 看了下源码,发现subList只是复制了引用,并且新生产的subList也是一个ArrayList实例 这样子的话,如果一个ArrayList调用了subList之后,岂不是代表不能再对两个中的任一个list进行修改(即调用add或remove方法)了,原因如下: 假设一个ArrayList A 调用了subList之后生成一个B,由于A,B都是ArrayList实例,并且A和B都是“快速失败”的,而且A和B共用了一块部分,如果此时修改A,B将会抛ConcurrentModificationException,同理修改B,A也会抛异常。 不知道我的理解对不对,如果没理解错的话,这种设计岂不是很糟糕。以后岂不是调用subList要很小心了。
------解决方案--------------------
这是API的解释: * Returns a view of the portion of this list between the specified * <tt>fromIndex</tt>, inclusive, and <tt>toIndex</tt>, exclusive. (If * <tt>fromIndex</tt> and <tt>toIndex</tt> are equal, the returned list is * empty.) 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>
测试:
Java code
List l = new ArrayList();
l.add("a");
l.add("b");
l.add("c");
List s = l.subList(0, 2);
s.add("d");
System.out.println(l.size());
System.out.println(s.size());
------解决方案--------------------
API的中文说明: