public static void main (String[] args) {
List masterList = new ArrayList();
masterList . add (”one") ;'
masterList . add (” tow" );
masterList . add (” three " );
masterList . add (” four " ) ;
masterList . add (” five " ) ;
List branchList = masterList.subList( 0 , 3 ) ;
//下发三行代码,如果不注释掉则会导致branchList 操作出现异常(第一处)
//masterList . remove( 0);
//masterList . add (” ten ” );
//masterList.clear() ;
//下方四行全部能正确执行
branchList.clear() ;
branchList . add (” six " );
branchList . add (” seven” );
branchList.remove( 0);
//正常遍历结束,只有一个元素
for (Object t : branchList) {
System . out . println(t);
// 子列表修改导致住列表也被动,输出:[seven,four,five]
System out.println(masterList );
第一处说明,如果不注释掉, masterList 的任何关于元素个数的修改操作都会导branchList 的“增删改查”抛出 ConcurrentModificati onException 异常。在实际调研中
大部分程序员知道 subList 子列表无法序列化 也知道它的修改会导致主列表的修改但是并不知道主列表元素个数的改动会让子歹lj 表如此敏感,频频抛出异常。在实际代码中,这样的故障案例属于常见的类型。 subList 方法返回的是内部类 SubList 的对象SubList 类是 Array ist 的内部类, SubList 的定义如下 并没有实现序列化接口 无法网络传输:
在集合遍历时维护一个初始值为0的游标cursor,从头到尾地进行扫描,在cursor=-size时,退出遍历。如图6-2所示,执行remove这个元素后,所有元素往前拷贝,size=size-1即为2,这时 cursor也等于2。在执行hasNext()时,结果为false,退出循环体,并没有机会执行到next()的第一行代码checkForComodification(),此方法用来判断expectedModCount和 modCount是否相等,如果不相等,则抛出ConcurrentModificationException异常。