ArrayList与for循环的故事
/**版本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
- scala与for循环的故事
- java关于for,foreach,iterator循环ArrayList的方式测试
- C#基础总结之三循环控制-for-数组-乘法表-arraylist
- 增强for循环用法___ArrayList数组实现使用下标最好,LinkedList使用增强型的(转载)
- 为什么不能在ArrayList的For-Each循环中删除元素
- for循环中ArrayLis嵌套用ArrayList的一些坑
- ArrayList的addAll 与 for循环比较
- ArrayList可以用for循环遍历,LinkedList不要用for循环遍历
- Shell 脚本之循环语句(for,while,until)以及case,select,break,continue实例详解
- 二级for循环的外层循环忘记退出引起的bug
- 增强for循环和普通for循环的区别
- Powershell for循环语句示例
- Java for-each循环解惑
- 用js的for循环获取radio选中的值
- for循环的优化
- JavaSE (七)循环控制语句:while、do....while、for,break和continue用法
- PHP中for循环语句的几种变型
- for循环程序块的处理顺序
- Java 增强 for 循环