java迭代器删除两个

当您查看最流行的Java面试问题时,您可能会遇到有关故障快速和故障安全迭代器的问题:

故障快速迭代器和故障安全迭代器之间有什么区别?

简化的答案是:

如果在迭代过程中修改了集合,则快速失败迭代器将引发ConcurrentModificationException ,但不会失败保护。

尽管这完全有道理,但不清楚访调员的故障安全含义。 对于迭代器,Java规范未定义此术语。 但是,有四种同时进行修改的策略。

并发修改

首先,让我们定义什么是并发修改。 例如,当我们有一个来自集合的活动迭代器并且对该集合进行了某些更改,但它们不是来自我们的迭代器时,会发生并发修改。 最明显的例子是当我们有多个线程时–一个线程正在迭代,第二个线程在同一集合中添加或删除元素。 但是,当我们在单线程环境中工作时,我们也可以获取ConcurrentModificationException

List<String> cities = new ArrayList<>();
cities.add(“Warsaw”);
cities.add(“Prague”);
cities.add(“Budapest”);Iterator<String> cityIterator = cities.iterator();
cityIterator.next();
cities.remove(1);
cityIterator.next(); // throws ConcurrentModificationException

不及格

上面的代码段是快速失败迭代器的示例。 如您所见,一旦我们尝试从迭代器中获取第二个元素,就会引发ConcurrentModificationException 。 迭代器如何知道创建集合后是否对其进行了修改? 您可能在集合中有一个时间戳,例如lastModified 。 创建迭代器时,需要复制该字段并将其存储在迭代器对象中。 然后,无论何时调用next()方法, lastModified需要将集合中的lastModified与迭代器中的副本进行比较。 例如,可以在ArrayList实现中找到非常相似的方法。 有一个modCount实例变量,其中包含对列表进行的修改次数:

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

值得一提的是,快速失败迭代器是在尽力而为的基础上工作的-无法保证如果存在并发修改,则会抛出ConcurrentModificationException ,因此我们不应该依赖该行为-而是应将其用于检测错误。 大多数非并行集合都提供快速失败的迭代器。

弱一致性

java.util.concurrent包中的大多数并发集合(例如ConcurrentHashMap和most Queues )都提供了弱一致性的迭代器。 文档中对它的含义进行了很好的解释:

  • 他们可能会与其他操作同时进行
  • 他们永远不会抛出ConcurrentModificationException
  • 它们被保证可以遍历在构造时已经存在的元素一次,并且可以(但不保证)反映出构造后的任何修改。

快照

在此策略中,从创建迭代器的那一刻起,迭代器就与集合的状态相关联-我们的集合快照。 对初始集合所做的任何更改都会创建基础数据结构的新版本。 当然,我们的快照是不变的,因此它不反映在创建迭代器之后对集合所做的任何更改。 这是一种古老的好的写时复制(COW)技术。 它完全解决了并发修改问题,因此不会引发ConcurrentModificationException 。 此外,迭代器不支持元素更改操作。 写入时复制集合通常太昂贵而无法使用,但是如果突变发生的次数显着减少,遍历遍历次数可能是个好主意。 示例为CopyOnWriteArrayListCopyOnWriteArraySet

未定义

未定义的行为可以在传统集合中找到,例如VectorHashtables 。 它们都具有具有快速失败行为的标准迭代器,但是它们还公开了Enumeration接口的实现,该接口在定义并发修改时不定义行为。 您可能会看到某些项目被重复或跳过,甚至飞来飞去的一些怪异异常。 最好不要玩这个野兽!

翻译自: https://www.javacodegeeks.com/2017/11/tale-two-iterators.html

java迭代器删除两个

java迭代器删除两个_两个迭代器的故事相关推荐

  1. java学生管理系统界面录入_[两个例题教学中的学生插话] java学生管理系统界面...

    课堂教学是动态生成的过程,在教师的预设外经常会出现学生自己的不同想法,他们通过插话等方式表达,其中有些具有典型和代表性,教师应该在分辨后充分利用以达到较好的生成.下面是一元一次方程应用教学的两个例题教 ...

  2. 安装java失败删除不掉_问题8:Java程序安装却删除不了怎么办?

    大家在使用手机的时候,通常都会遇到这么一个问题:我的手机安装了程序,怎么想删却删不掉呢?又或者是程序删掉了,图标删不掉.类似的情况再很多平台的手机上都可能出现,今天我们就针对这个问题,给大家介绍一下简 ...

  3. java数组删除数组元素_如何在Java中删除数组元素

    java数组删除数组元素 When we create an array in Java, we specify its data type and size. This is used by JVM ...

  4. java递归删除文件夹_如何使用递归删除Java中的目录/文件夹

    java递归删除文件夹 Earlier we learned how to create a file in java and how to delete a file in java. Here w ...

  5. java. 三个人比赛怎么写_两个乒乓球队进行比赛,找出三队赛手的名单

    [java]代码库import java.util.ArrayList; /** * 两个乒乓球队进行比赛,各出三人.甲队为a,b,c三人,乙队为x,y,z三人.已抽签决定比赛名单.有人向队员打听比赛 ...

  6. java 两份文档相似性_两个数据集之间的相似百分比

    How to find the similarity (not correlation) between two datasets? 我无法找到匹配数据集之间的相似性 . 我有一个主数据集,我想测试相 ...

  7. java百米赛跑图形界面_两百米赛跑请问各位,两百米的赛跑技巧?br/怎么样边跑边适当 爱问知识人...

    运动员或教练可能没时间详细给你在网络上这样回答. 我帮你找个, 觉得还适用. 400米是一个对运动员的综合素质要求最高的运动项目,因为400米有两个弯道,如果你弯道的技术不好的话,很可能在弯道的地方别 ...

  8. JAVA前叉容易断_两次断叉感悟

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 两次断叉心得(八个月) 其实大多数人遭遇严重伤病的心情都差不多,我记得我当时的情绪比你更低落,那是因为我第一次手术后恢复得相当好,除了弹跳差点外其他的跟手 ...

  9. java list取出相同值_两个List集合取相同重复数据的方法

    以下是两个list取重复的代码: public static void main(String[] args) { List list1 = new ArrayList(); for (int i = ...

最新文章

  1. CDH 5.16.1 + Redhat 7.0 部署(二)
  2. 客户合作伙伴关系问题
  3. oracle 触发器 和 常用内置程序包
  4. 颠覆传统,仅银行卡大小充电宝,10000mAh可登机,手机党出门随身必备!
  5. java 进程不关闭_java运行程序关不了窗口
  6. java代码从服务器拉取到本地,集成到idea报错
  7. python threading.Condition
  8. 论高性能机房标识标签管理办法一现状篇
  9. SQL Server维护计划–好处,功能和特性
  10. 字节Java全能手册火了!Redis/Nginx/Dubbo/Spring全家桶/啥都有
  11. HDU 5934 2016CCPC杭州 B: Bomb(Trajan强连通)
  12. Atitit。木马病毒原理机密与概论以及防御
  13. 如何获取iphone的UUID
  14. Vue按钮封装防抖功能
  15. 数组合并对象里相同属性值
  16. Compose基础-SideEffect(二)
  17. SpringMVC工作原理之四:MultipartResolver
  18. 冒充云销售的懒虫和毒虫们
  19. Cocos Creator SDK接入OPPO篇
  20. java基本类型val_Java的基本数据类型

热门文章

  1. LOJ洛谷P3225:矿场搭建(割点、点双)
  2. 51nod-动物与游戏【树链剖分,线段树】
  3. P5825-排列计数【EGF,NTT】
  4. YbtOJ#526-折纸游戏【二分,hash】
  5. P5304-[GXOI/GZOI2019]旅行者【最短路】
  6. jzoj1402-偷懒的小X【贪心】
  7. jzoj4671-World Tour【图论,bfs】
  8. jzoj4272-序章-弗兰德的秘密【树形dp】
  9. Grakn Forces 2020——D题Pecco模型总结
  10. Tengine-Ngnix高级版