
看《java手册》时发现1可以删除2不可以删除1.
1。首先以前的知识:增强for循环走的是迭代器不能再里面进行增删操作;建议用迭代器进行增删操作。模糊记得是一个modcount的值不相等导致的。
2。现在一个可以删除一个不能删除奇怪跟下代码



看来list是被删除成功了,但是在迭代器走下一步调用next的时候进行modcount和exceptmodcount比较的时候抛出异常。为什么不相等呢

生成迭代器的时候会把一个叫modcount的值给expectedModCount,但是list在删除的时候对modcount进行了修改所以导致两边值不一致抛出异常

好了到现在能解释为啥删除2会抛出异常了,但是目前的道理还不允许删除1抛出异常,为什么1能删除成功呢?
3.做了几次试验发现删除倒数第二个总是能删除成功,跟代码发现删除导数第二个之后不再走循环也就是说不会调用迭代器的next方法所以不会抛出异常。那么为什么不走迭代器了呢?
4.看下字节码,for究竟干了啥。嗯貌似啥也没干,就是调用下hasnext和next
看下hasnext,用ArrayList的size和cursor; // index of next element to return比较,好了可以理解了,因为删除倒数第二个后list的size和迭代器的下一个index相等导致迭代器认为不会走下一个了才会跳出循环,不执行next方法自然不会报错了

5.总结下只要删除后当前list的大小和迭代器的下一个index相等就能删除,所以下面这段代码也是能删除的,嗯、、、、搞了半天感觉啥也没收获到,为了纪念下浪费的时间写篇博客


2423

被折叠的 条评论
为什么被折叠?



