我是靠谱客的博主 害怕紫菜,最近开发中收集的这篇文章主要介绍ArrayList循环遍历并删除元素的陷阱,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

import java.util.ArrayList;
public class ArrayListRemove {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("b");
list.add("c");
list.add("c");
list.add("c");
remove(list);
for (String s : list) {
System.out.println("element : " + s);
}
}
public static void remove(ArrayList<String> list) {
// TODO:
}
}

错误写法实例一:for循环遍历list

public static void remove(ArrayList<String> list) {
for (int i = 0; i < list.size(); i++) {
if (list.get(i).equals("del"))
list.remove(i);
}
}

删除某个元素后,list的大小发生了变化,而索引也在变化,所以会导致在遍历的时候漏掉某些元素。比如当删除第1个元素后,继续根据索引访问第2个元素时,因为删除的关系后面的元素都往前移动了一位,所以实际访问的是第3个元素。因此,这种方式可以用在删除特定的一个元素时使用,但不适合循环删除多个元素时使用。

解决方法: 从list最后一元素开始开始遍历。

public static void remove(ArrayList<String> list) {
for (int i = list.size() - 1; i >= 0; i--) {
if (list.get(i).equals("b"))
list.remove(i);
}
}

错误写法实例二:增强for循环

public static void remove(ArrayList<String> list) {
for (String s : list) {
if (s.equals("b")) {
list.remove(s);
}
}
}

删除元素后继续循环会报错误信息ConcurrentModificationException,因为元素在使用的时候发生了并发的修改,导致异常抛出 解决:删除完毕马上使用break跳出,则不会触发报错。

public static void remove(ArrayList<String> list) {
for (String s : list) {
if (s.equals("b")) {
list.remove(s);
break;
}
}
}

错误写法实例三:iterator遍历

public static void remove(ArrayList<String> list) {
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String x = it.next();
if (x.equals("b")) {
it.remove();
}
}
}

这种方式可以正常的循环及删除。但要注意的是,使用iterator的remove方法,如果用list的remove方法同样会报上面提到的ConcurrentModificationException错误。

总结:

  1. 循环删除list中特定一个元素的,可以使用三种方式中的任意一种,但在使用中要注意上面分析的各个问题。
  2. 循环删除list中多个元素的,应该使用迭代器iterator方式,或者list从后往前删除。

最后

以上就是害怕紫菜为你收集整理的ArrayList循环遍历并删除元素的陷阱的全部内容,希望文章能够帮你解决ArrayList循环遍历并删除元素的陷阱所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(60)

评论列表共有 0 条评论

立即
投稿
返回
顶部