import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Abnormal {
public static void main(String[] args) {
//创建对象,再添加数据
List<String> list = new ArrayList<>();
list.add("张三");
list.add("陈七");
list.add("李麻子");
list.add("李四");
list.add("王五");
//利用迭代器进行遍历,先创建迭代器
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()){
String a = iterator.next();
if (a.contains("李")){
list.remove(a);
}
}
System.out.println(list);
}
}
运行结果如下:
像以上情况,一边遍历的时候去删除数据,直接会报错,原因是因为集合是一个可变的容器,每删一个数据,容器的大小都会改变,那么数据存放的位置也会相应的改变。迭代器遍历可能不好理解,我们就换成普通的 for 循环,但是两者的出现的 Bug 是一样的。
代码如下:
java复制代码
import java.util.ArrayList;
import java.util.List;
public class Text_For {
public static void main(String[] args) {
//创建对象,再添加数据
List<String> list = new ArrayList<>();
list.add("张三");
list.add("陈七");
list.add("李麻子");
list.add("李四");
list.add("王五");
for (int i = 0; i < list.size(); i++) {
String a = list.get(i);
if (a.contains("李")){
list.remove(a);
}
}
System.out.println(list);
}
}
运行结果如下:
发现用 for 循环竟然不报错,原因可能是没有用迭代器遍历严谨吧,以上的两种代码的效果都是一样的,会出现 Bug ,就是本来要删除带 "李" 的名字,但是发现名字还有一个"李四",没有被删除,那是什么原因呢?
直接会把 "李四" 忽略掉,这就是这出现 Bug 的地方。
1.1 如何解决集合的并发修改问题
对于用普通的 for 循环来遍历的代码来说可以有两种方法;第一个方法就是每一次删除数据的时候,都要进行 i--; 第二方法就是从尾开始遍历。
代码如下:
第一种方法
java复制代码
import java.util.ArrayList;
import java.util.List;
public class Text_For {
public static void main(String[] args) {
//创建对象,再添加数据
List<String> list = new ArrayList<>();
list.add("张三");
list.add("陈七");
list.add("李麻子");
list.add("李四");
list.add("王五");
for (int i = 0; i < list.size(); i++) {
String a = list.get(i);
if (a.contains("李")){
list.remove(a);
i--;
}
}
System.out.println(list);
}
}
运行结果如下:
成功把"李四"也删除掉了。
第二种方法
java复制代码
import java.util.ArrayList;
import java.util.List;
public class Text_For {
public static void main(String[] args) {
//创建对象,再添加数据
List<String> list = new ArrayList<>();
list.add("张三");
list.add("陈七");
list.add("李麻子");
list.add("李四");
list.add("王五");
for (int i = list.size() - 1; i >= 0; i--) {
String a = list.get(i);
if (a.contains("李")){
list.remove(a);
}
}
System.out.println(list);
}
}