循环条件持续变化的影响?ArrayList遍历删除代码结果解析
嘿,很高兴能帮你理清这两个问题!咱们一个一个来拆解:
1. For循环条件持续变化的影响
当for循环的条件(也就是第二个表达式)在循环过程中不断变化时,会导致循环的执行逻辑变得不可预测,常见的结果有这几种:
- 无限循环:如果条件始终无法被满足终止,比如写了
for(int i=0; i<10; i--),i会越来越小,永远小于10,循环就会一直跑下去停不下来。 - 提前终止循环:如果循环内部的操作让条件突然不成立,比如
for(int i=0; i<5; ){ i++; if(i==3) i=6; },当i变成6后,i<5不成立,循环直接结束,不会执行到i=4、5的情况。 - 循环次数与预期不符:就像你第二个问题里的场景,条件依赖的变量(比如列表的size)在循环中被修改,导致实际遍历的元素数量和你预想的不一样,出现漏处理的情况。
2. ArrayList循环删除的现象解释
首先得纠正那个错误说法:只有当ArrayList一开始是空的时候,这个循环才永远不会运行。当列表有元素时,循环会执行,但因为myList.size()和索引i的变化不同步,才出现了最后剩下[3, 17, 33]的结果。
咱们拿输入列表[-1, 3, 28, 17, 9, 33]一步步模拟循环过程:
- 初始状态:
i=0,列表长度size=6,满足0<6,执行remove(0)删除第一个元素-1,列表变成[3, 28, 17, 9, 33],然后i自增到1。 - 现在
i=1,列表长度size=5,满足1<5,执行remove(1)删除索引1的元素28,列表变成[3, 17, 9, 33],i自增到2。 - 接下来
i=2,列表长度size=4,满足2<4,执行remove(2)删除索引2的元素9,列表变成[3, 17, 33],i自增到3。 - 此时
i=3,列表长度size=3,3<3不成立,循环直接终止。
为什么会漏删元素?因为ArrayList是基于数组实现的,删除一个元素后,该索引后面的所有元素都会往前移动一位。比如删除索引0的-1后,原来索引1的3移到了索引0的位置,但下一次循环i已经变成1,直接跳过了现在在索引0的3,导致它没被删除。
如果想要正确删除所有元素,推荐两种方式:
- 倒序遍历:
for(int i = myList.size() - 1; i >= 0; i--) { myList.remove(i); },这样即使元素前移,也不会跳过要处理的元素。 - 使用迭代器:
Iterator<Integer> it = myList.iterator(); while(it.hasNext()) { it.next(); it.remove(); },迭代器的remove()方法会自动处理索引的变化,避免漏删。
内容的提问来源于stack exchange,提问作者suba
相关产品推荐
相关产品推荐

