java中 foreach 和迭代器在遍历 List 集合 一些情况下为什么能使用集合自动的删除方法删除元素?

foreach 和迭代器在遍历 集合的List 集合的时候 不是不能使用 集合自带的删除方法删除元素吗?在特殊的情况下可以。为什么public static void main(String[] args) { ArrayList<Integer> list=new ArrayList<Integer>(); Collections.addAll(list,657, 74, 963, 66, 81); for(Integer a:list){ /* * 如果(a<70) 程序运行正常 不会有并发修改异常 但是 a<90 就会报并发修改异常 * 或者 把三位数 改成一个别的2位数 也会报错 为什么 * */ if(a<70){// list.remove(a); } } System.out.println(list); }

你a<70的时候是倒数第二位,也就是66,没有抛出异常是因为之前list大小为5,你删除66后,list大小为4,你第一次遍历list大小为5的数组的时候,66的cursor在index = 4,当你删除后,遍历list大小为4的数组时, cursor = 4 = newlist.size()。

ArrayList里的这个方法就会判断list已经读取完毕了,所以不会抛出异常。

public boolean hasNext() {
    return cursor != size;
}

a < 90的时候在第二位就发生了变化,list的大小也发生了变化

看了下ArrayList的源码,每次循环的时候都会call这个方法检查list的大小是否发生了变化,但是这个方法是发生在hasNext方法之后的

final void checkForComodification() {
    if (modCount != expectedModCount)
        throw new ConcurrentModificationException();
}

温馨提示:内容为网友见解,仅供参考
无其他回答

java中 foreach 和迭代器在遍历 List 集合 一些情况下为什么能使用集合...
手机版 我的知道 java中 foreach 和迭代器在遍历 List 集合 一些情况下为什么能使用集合自动的删除方法删除元素? 200  我来答 分享 微信扫一扫 网络繁忙请稍后重试 新浪微博 QQ空间 举报 可选中1个或多个下面的关键词,搜索相关资料。也可直接点“搜索资料”搜索整个问题。 java foreach 迭代 list 集合 ...

java日常开发必备:list的四种遍历
首先,基础遍历犹如直接操作数组,从列表的第一个元素开始逐个处理。需要注意的是,这种方法虽然直观,但不够灵活,且不适用于List的增删操作,其打印结果如下:对于进阶开发者,foreach遍历方式更受欢迎。虽然它简洁易用,但其底层实则是依赖于迭代器机制。通过反编译代码,我们可以观察到foreach调用的是迭...

java中foreach的语法,用法是什么?
1. 遍历数组:使用foreach循环可以方便地遍历数组中的每一个元素,而无需知道数组的具体大小。例如:java int[] numbers = {1, 2, 3, 4, 5};for { System.out.println;} 这段代码会依次打印出数组`numbers`中的每个元素。2. 遍历集合:对于Java集合框架中的集合,如List、Set等,同样可以使用...

Java中foreach循环用法详解,真香!
虽然foreach广泛适用于List、Set和Map等集合,但在处理Map时,只能遍历键或值,不能同时操作键值对。此外,foreach的一大限制是,由于其底层使用迭代器,禁止在循环体内直接执行remove或add操作,以防并发修改集合引发ConcurrentModificationException。为避免这个问题,当需要在循环中对集合进行增删操作时,应使...

Java 中多种循环 List 的方式详解
其次,获取List的迭代器后,可借助while循环安全地遍历列表元素。迭代器支持在遍历时删除元素,且操作更安全。Java 8引入的forEach方法简化了处理列表元素的过程。只需在List上应用此方法,结合Lambda表达式,即可实现简洁高效的处理逻辑。紧接着,Stream API的引入为List操作提供了强大的功能。通过将List转换...

java map 用for循环的问题
亲,你要搞清楚。集合类的foreach只能用来遍历,不能进行修改操作的。即不能修改、删除、添加元素。只能遍历。如果进行了修改操作的话。会抛出java.util.ConcurrentModificationException异常,表示你不同在遍历的同时,又进行修改。如果你非得,要做修改操作。请选择正常的for循环。以List为例。 List<St...

Java中list如何利用遍历进行删除操作
方法有很多,比如可以在for和foreach 等循环遍历,然后删除,下面在介绍两种方案. 第一种.迭代循环, 然后删除. 第二种java8开始的流操作 import java.util.*;import java.util.stream.Collectors;public class MyListDemo {public static void main(String[] args) {test1(); \/\/传统方法test2(); \/\/...

Java遍历集合的所有方式
其次,增强for循环,也被称为foreach循环,简化了对集合元素的访问。它利用迭代器内部机制,代码可读性更强,是遍历列表的常见选择。通过jad反编译工具,我们可以看到增强for循环实际上依赖于迭代器的实现。Iterator模式是Java集合中的核心概念,提供了hasNext()和next()方法,用于逐个访问集合元素。List...

java的这三种for循环有什么区别?
第一种是最普通的for循环 这个应该没啥好说的 第二种是第一种for循环的变种也可以说是简写 只能对数组或者是List这样的集合使用 这个是java 1.5新加入的 第三种不是for循环。使用的是迭代器 iterator 像是List这样的集合 一般多是用这种方法 ...

java list 是什么意思
Java List有许多常见的操作,包括添加、插入、删除、查询和遍历等。添加元素可以使用add()方法,插入元素可以使用add(index,ele)方法,删除元素可以使用remove()方法,查询元素可以使用get()方法。除此之外,Java List还支持遍历操作,可以使用for循环、foreach循环或者迭代器来遍历List中的元素。Java List...

相似回答