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
- 第一次循环,
i=0:- 移除索引0的元素"a",列表变成
["b","c","d"],size变为3 - 输出"a"
i自增到1
- 移除索引0的元素"a",列表变成
- 第二次循环,
i=1:- 此时列表的索引1已经变成了"c"(因为移除"a"后,后面的元素都往前挪了一位)
- 移除"c",列表变成
["b","d"],size变为2 - 输出"c"
i自增到2
- 第三次循环检查条件:
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
相关产品推荐
相关产品推荐

