/**版本1.8
*[0,9]的一个Arraylist,要求把其中奇数删除。
*于是便有了以下代码!
/
import java.util.ArrayList;public class ArrayTest
{
public static void main(String[] args)
{
ArrayList list = new ArrayList();
for ( int i = 0; i < 10; i++ )
{
list.add( new Integer( i ) );
}
for ( int i = 0; i < list.size(); i++ )
{
int in = (( Integer )list.get( i )).intValue();
if ( in % 2 == 1 )
{
list.remove( i );
}
}
for ( int i = 0; i < list.size(); i++ )
{
System.out.println( list.get(i));
}
}
}
// 输出结果正确
结果分析: ArrayList list 在执行remove()方法时,list.size()方法返回值会发生改变.
i == 0 in == 0 if false
i==1 in ==1 第一次执行完remove(1)方法后,数据变成0 2 3 4 5 6 7 8 9 list.size() == 9
第二次执行 remove(2)数据变成0 2 4 5 6 7 8 9,list.size() == 8
依次类推....
当执行第5次remove(5)时,数据变成 0 2 4 6 8,list.size() == 5
for判断语句 i == 6 > list.size() == 5;
循环结束。打印结果。。。
因此我觉得这种方法是不科学的,也不安全,因此我采用Iterator迭代器去删除
//下面的代码替代for循环部分
Iterator iter = list.iterator();
while ( iter.hasNext() )
{
Integer in = (Integer)iter.next();
if ( in.intValue() % 2 == 1 )
{
list.remove( in );
}
}
然后问题又来了,抛出异常,
通过查看源代码我们发现
调用list.remove()方法导致modCount和expectedModCount的值不一致。
解决办法:
其实很简单,细心的朋友可能发现在Itr类中也给出了一个remove()方法:
在这个方法中,删除元素实际上调用的就是list.remove()方法,但是它多了一个操作:
expectedModCount = modCount;
因此,在迭代器中如果要删除元素的话,需要调用Itr类的remove方法。
将上述代码改为下面这样就不会报错了:
Iterator iter = list.iterator();while ( iter.hasNext() )
{
Integer in = (Integer)iter.next();
if ( in.intValue() % 2 == 1 )
{
iter.remove();
}
}
参考文章:http://www.cnblogs.com/dolphin0520/p/3933551.html