今天无意之中在程序中需求遍历一个ArrayList集合,结果一直都发现好像有问题,调试了一下,发现程序并没有按照条件来进行移除操作,到网上搜了下,才发现遍历ArrayList是要注意一个小问题的,问题大概如下:
问题发生的原因分析:
被遗漏的并不是原list的0号item,而是1号item
为什么呢?因为当你remove第i个item时,第 [i + 1, count)域中所有items的索引值皆减一(array是连续的,要满足只要有k ∈ [0, count)则array[k]必存在),那么当你在循环下一轮用i + 1为索引访问的即是原先list中索引为i + 2的那个item,由此可知,上例中0号被删除时,原1号变为新0 号,原2号变为新1号。。。下一轮访问的1号就是先前的2号,而原始的1号则永远没有被访问到
明白了这个自然可以得出正确的迭代方法,正序时需注意索引和可能变化的终止条件,倒序时则简单些。
说白了就是因为removeat方法会改变count方法的返回值,就造成了不是每个元素都被遍历到。