首页
学习
活动
专区
圈层
工具
发布
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    为什么foreach中不允许对元素进行add和remove

    Exception in thread "main" java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification...(ArrayList.java:911) at java.util.ArrayList$Itr.next(ArrayList.java:861) 这时候就有人说,你为啥不直接用 iterator 迭代器遍历呢...Exception in thread "main" java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification...(ArrayList.java:911) at java.util.ArrayList$Itr.next(ArrayList.java:861) 都出现了相同的异常 ConcurrentModificationException...,实际上很简单,复制 也就是他创建一个新的数组,再将旧的数组复制到新的数组上,但是为什么很少有人推荐这种做法,根本原因还是 复制 因为你使用了复制,那么就一定会出现有两个存储相同内容的空间,这样消耗了空间

    77010

    Java中List迭代过程中删除、新增元素的处理

    参考链接: Java 8中迭代带有索引的流Stream 异常信息:  java.util.ConcurrentModificationException  at java.util.ArrayList$...Itr.checkForComodification(ArrayList.java:859) at java.util.ArrayList$Itr.next(ArrayList.java:831) at...:192)  代码:  @Test     public void testIterator (){         //测试ArrayList迭代过程中删除元素,         //避免抛出 java.util.ConcurrentModificationException...,如果在多线程应用程序中出现同时访问,而且出现修改操作的时候都要求外部操作同步化;调用Iterator操作获得的Iterator对象在多线程修改Set的时候也自动失效,并抛出java.util.ConcurrentModificationException...Iterator被创建的时候,建立了一个内存索引表(单链表),这 个索引表指向原来的对象,当原来的对象数量改变的时候,这个索引表的内容没有同步改变,所以当索引指针往下移动的时候,便找不到要迭代的对象,于是产生错误

    1.5K00

    快速失败Vs安全失败(Java迭代器附示例)

    will throw ConcurrentModificationException } } } Output : Exception in thread "main" java.util.ConcurrentModificationException...at java.util.ArrayList$Itr.checkForComodification(Unknown Source) at java.util.ArrayList$Itr.next...,所以任何对原集合对象的结构性修改都会被迭代器忽略,但是这类迭代器有一些缺点,其一是它不能保证你迭代时获取的是最新数据,因为迭代器创建之后对集合的任何修改都不会在该迭代器中更新,还有一个缺点就是创建克隆对象在时间和内存上都会增加一些负担...,就是有一个地方和javadoc有出入,即“大多数集合类返回的快速失败迭代器在遍历时不允许结构性修改(结构性修改指添加,删除和更新集合中一个元素)”这一句,而javadoc中对此的解释是“结构上的修改是指任何添加或删除一个或多个元素的操作...,或者显式调整底层数组的大小;仅仅设置元素的值不是结构上的修改。”

    1.6K70

    JAVA 集合list,Map删除元素的方法总结

    } System.out.println("list=" + list.toString()); } 输出结果: Exception in thread "main" 1 2 java.util.ConcurrentModificationException...at java.util.ArrayList$Itr.checkForComodification(Unknown Source) at java.util.ArrayList$Itr.next(...如果单线程发出违反对象协定的方法调用序列,则该对象可能抛出此异常。例如,如果线程使用快速失败迭代器在 collection 上迭代时直接修改该 collection,则迭代器将抛出此异常。...Java中的For each实际上使用的是iterator进行处理的。而iterator是不允许集合在iterator使用期间删除的。...如果进行迭代时用调用此方法之外的其他方式修改了该迭代器所指向的集合,则迭代器的行为是不明确的。

    3.6K50

    Java,你告诉我 fail-fast 是什么鬼?

    Exception in thread "main" java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification...(ArrayList.java:909) at java.util.ArrayList$Itr.next(ArrayList.java:859) at com.cmower.java_demo.str.Cmower3...equals(str)) { list.remove(str); } } for 循环虽然可以避开 fail-fast 保护机制,也就说 remove 元素后不再抛出异常;但是呢,这段程序在原则上是有问题的...05、最后 在 Java 中,fail-fast 从狭义上讲是针对多线程情况下的集合迭代器而言的。这一点可以从 ConcurrentModificationException 定义上看得出来。...因为从广义上讲,fail-fast 指的是当有异常或者错误发生时就立即中断执行的这种设计,从单线程的角度去分析,大家更容易明白。

    66510
    领券