您的位置:首页 > 其它

ArrayList与for循环的故事

2016-03-31 23:52 363 查看

/**版本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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: