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

ArrayList的remove()方法返回值是什么?循环调用为何仅输出a和c?

问题解析:ArrayList循环remove只输出部分元素的原因&remove方法返回值说明

先明确第二个问题:ArrayList的remove(int index)方法返回的是被移除的那个元素本身——也就是你传入的索引位置上原本存在的对象。比如你移除索引0的元素,就会返回"a",完全符合你代码里的预期。另外要注意,ArrayList还有个重载方法remove(Object o),这个返回的是boolean值,表示是否成功移除了指定对象,别把这两个方法搞混哦。

接下来解释为什么你的循环只输出了a和c:这是因为你在正向循环中修改了列表的长度和元素位置,导致索引错位了。咱们一步步走一遍代码的执行流程:

初始状态:list = ["a","b","c","d"],size=4

  1. 第一次循环,i=0:
    • 移除索引0的元素"a",列表变成["b","c","d"],size变为3
    • 输出"a"
    • i自增到1
  2. 第二次循环,i=1:
    • 此时列表的索引1已经变成了"c"(因为移除"a"后,后面的元素都往前挪了一位)
    • 移除"c",列表变成["b","d"],size变为2
    • 输出"c"
    • i自增到2
  3. 第三次循环检查条件:i=2,list.size()=2,2<2不成立,循环直接结束

看到没?原本的"b"在第一次移除后跑到了索引0的位置,但i已经变成1了,再也不会遍历到它;"d"同理,第二次移除后到了索引1,但i变成2后循环就停了。所以你只拿到了a和c。

怎么解决这个问题?

有几种靠谱的方式:

  • 倒序循环:从最后一个元素往前删,这样前面的元素位置变动不会影响当前遍历的索引:
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
for(int i=list.size()-1; i>=0; i--) {
    Log.d("Removed+++++++++++","++++"+list.remove(i));
}

这样会依次输出d、c、b、a,所有元素都会被移除。

  • 使用Iterator迭代器:这是Java官方推荐的在遍历中修改集合的方式,不会出现索引错位问题:
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()) {
    String removed = iterator.next();
    Log.d("Removed+++++++++++","++++"+removed);
    iterator.remove(); // 这里要用迭代器的remove方法,不是list的remove
}

这种方式更安全,尤其是在多线程场景下(单线程场景也推荐使用)。

  • 用while循环控制索引:如果一定要正向遍历,可以保持索引不变,直到元素被移除后再处理:
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
int i=0;
while(i < list.size()) {
    Log.d("Removed+++++++++++","++++"+list.remove(i));
    // 这里不要自增i,因为移除后后面的元素会前移,下一个元素还是在当前索引位置
}

内容的提问来源于stack exchange,提问作者Pritish

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:43:24