List集合在边遍历边删除时使用for循环会报错java.util.ConcurrentModificationException
错误方法:
List<Integer> resultList = new ArrayList<>();
resultList.add(1);
resultList.add(2);
resultList.add(3);
for (Integer temp : resultList){
if (temp == 1){
resultList.remove(temp);
}
}
System.out.println(resultList.toString());
造成报错
java.util.ConcurrentModificationException
正确方法:
List<Integer> resultList = new ArrayList<>();
resultList.add(1);
resultList.add(2);
resultList.add(3);
resultList.add(4);
Iterator<Integer> iterator = resultList.iterator();
while (iterator.hasNext()){
Integer integer = iterator.next();
if (integer == 1){
iterator.remove();
}
}
System.out.println(resultList.toString());
迭代器接口用四个方法:
(1)next();//越过当前位置到达下一位置,跨度一个单元。
(2)hasNext();//检查集合中是否还有元素(迭代器遍历的时候,如果集合没有元素了会报错,因此是后给你hasNext进行判断。)
(3)remove();//使用前需要搭配next(),否则报错,删除越过的元素。
(4)forEachRemaining(args);这个方法可以搭配lambda表达式对集合中的每个元素进行操作。
注意事项:
- 在对list列表进行操作的时候,如果是通过Arrays.asList生成的列表无法使用Iterator的remove方法,原因是不支持。报错如下:
UnsupportedOperationException()
解决办法:
将原数组通过流再转换成列表。
1.List<String> list = Arrays.asList(arry).stream().collect(Collectors.toList());
2.List<String> list = Arrays.stream(arry).collect(Collectors.toList());
两种方式均可。
- 在使用remove之前一定要使用next()方法,且两个方法掉用之间不能更改迭代器否则将会报错。
- 使用iterator迭代器的时候不可以对集合做维护和新增操作,如果要添加和更改元素,建议使用ListIterator代码如下:
@Test
public void test9() {
String[] arry = {"zuoshou3", "zuoshou2", "zuoshou1"};
String str = null;
List<String> list = Arrays.stream(arry).collect(Collectors.toList());
ListIterator<String> iterator = list.listIterator();
while(iterator.hasNext()){
str = iterator.next();
if (str == "zuoshou3"){
iterator.remove();
}
if (str == "zuoshou2"){
iterator.set("zuoshou2A");
}
if (str == "zuoshou1"){
iterator.add("zuoshou1After");
}
}
list.forEach(System.out::println);
}
zuoshou2A
zuoshou1
zuoshou1After
注: 文章是本人这段时间所学,如有错误的地方欢迎指正,互相交流!