You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

循环条件持续变化的影响?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]一步步模拟循环过程:

  1. 初始状态:i=0,列表长度size=6,满足0<6,执行remove(0)删除第一个元素-1,列表变成[3, 28, 17, 9, 33],然后i自增到1。
  2. 现在i=1,列表长度size=5,满足1<5,执行remove(1)删除索引1的元素28,列表变成[3, 17, 9, 33],i自增到2。
  3. 接下来i=2,列表长度size=4,满足2<4,执行remove(2)删除索引2的元素9,列表变成[3, 17, 33],i自增到3。
  4. 此时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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:02:40