为什么在迭代过程中从映射中删除不存在的元素有时只会崩溃?

机管局

注意:这不是许多问题的重复,这些问题询问如何在迭代过程中从地图上删除项目。

在使用哈希映射迭代器从映射中删除项目时,遇到了一些令人惊讶的边缘情况。

以下代码与a一起崩溃ConcurrentModificationException

Map<Integer, Integer> m = new HashMap<>();
m.put(1, 1);
m.put(2, 2);
m.put(3, 3);

for (Iterator<Map.Entry<Integer, Integer>> iterator = m.entrySet().iterator(); iterator.hasNext(); ) {
    Map.Entry<Integer, Integer> e = iterator.next();
    if (e.getKey() == 2) {
        iterator.remove();
    }
    m.remove(2); // This causes the crash
}

毫不奇怪,以下代码不会:

Map<Integer, Integer> m = new HashMap<>();
m.put(1, 1);
m.put(2, 2);
m.put(3, 3);

for (Iterator<Map.Entry<Integer, Integer>> iterator = m.entrySet().iterator(); iterator.hasNext(); ) {
    Map.Entry<Integer, Integer> e = iterator.next();
    if (e.getKey() == 2) {
        iterator.remove();
    }
    m.remove(4); // No crash here
}

但是,以下代码也不会崩溃:

Map<Integer, Integer> m = new HashMap<>();
m.put(2, 2);
m.put(3, 3);

for (Iterator<Map.Entry<Integer, Integer>> iterator = m.entrySet().iterator(); iterator.hasNext(); ) {
    Map.Entry<Integer, Integer> e = iterator.next();
    if (e.getKey() == 2) {
        iterator.remove();
    }
    m.remove(2); // Also no crash?
}

第一个示例和第三个示例之间的唯一区别是删除了<1,1>条目。为什么调用Map.remove有时只会崩溃?该标准在任何地方都有规定吗?

格特曼

第一个示例抛出a,ConcurrentModificationException因为您正在remove地图的迭代期间调用该方法。事件的顺序是这样。

  1. 调用next()以检索条目(1,1)。关键不是2,所以不要打电话iterator.remove()2直接致电即可从地图中删除带有键的条目m.remove(2)这将更改内部修改计数,该计数Iterator期望保持不变。
  2. 调用next()以检索下一个条目。映射中的修改计数不再与Iterator创建时所指出的预期修改计数匹配,因此将ConcurrentModificationException引发a。

最后一个示例不再抛出它,因为remove(2);它不再起作用。

  1. 调用next()以检索条目(2,2)。关键是2,因此致电iterator.remove(),删除条目。这具有修改迭代器的预期修改计数以匹配映射的修改计数的效果。调用m.remove(2)无效,因为该键2不再存在于地图中。
  2. 调用next()以检索条目(3,3)。映射中的修改计数与指示的预期修改计数匹配Iterator,因此不会ConcurrentModificationException抛出任何异常。关键不是2,所以iterator.remove()不被调用。调用m.remove(2)无效,因为该键2在地图中不存在。

请注意,以上事件序列对于JavaHashMap迭代其条目的当前方式有效密钥碰巧是按顺序检索的。通常,对于任何范围的有效整数键,都不能保证按顺序检索这些键

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

当我尝试从HashSet中删除不存在的元素时,为什么它没有给出运行时错误?

来自分类Dev

当我尝试从不存在的HashSet中删除元素时,为什么它没有给出运行时错误?

来自分类Dev

通过“ apt-get remove”删除软件包时,为什么在此过程中必须(有时)升级其他软件包?

来自分类Dev

在不存在的字典中访问元素时,为什么不引发回溯?

来自分类Dev

什么时候执行过程中不存在开销?

来自分类Dev

在转置过程中处理不存在的条目

来自分类Dev

为什么STL向量的迭代器指向不存在的元素?

来自分类Dev

什么是不存在的过程?

来自分类Dev

为什么有时候tensorflow在训练过程中运行的越来越慢?

来自分类Dev

使用forEach在迭代过程中从集合中删除元素

来自分类Dev

为什么C ++映射中没有“存在”功能?

来自分类Dev

快速模块映射中不存在模块“反应导航”

来自分类Dev

Haste模块映射中不存在模块`fs`

来自分类Dev

为什么在尝试删除该文件时显然不存在该文件?

来自分类Dev

为什么 Inkscape 有时在拖动对象时只会捕捉?

来自分类Dev

为什么Rails中不存在用于删除/销毁的直接路径?

来自分类Dev

为什么不能删除“不存在”但出现在我的下载目录中的文件?

来自分类Dev

当密钥不存在时,为什么没有收到KeyError?

来自分类Dev

当密钥不存在时,为什么没有收到KeyError?

来自分类Dev

“ ORA-00942:表或视图不存在”仅在存储过程中运行时

来自分类Dev

引用创建的易失性表导致过程中不存在错误

来自分类Dev

如何在存储过程中声明一行不存在?

来自分类Dev

目录不存在时应用崩溃

来自分类Dev

为什么运行“ ifconfig”时不存在“ 10.0.2.2”?

来自分类Dev

在PHP中,当类不存在时,为什么\ Foo \ Bar :: class不会生成错误?

来自分类Dev

创建表时,为什么MySQL数据库中不存在主键字段?

来自分类Dev

在迭代过程中添加或删除项目

来自分类Dev

为什么现有文件不存在?

来自分类Dev

尝试查找不存在的元素时,如何检查Web元素是否显示而不会崩溃?

Related 相关文章

  1. 1

    当我尝试从HashSet中删除不存在的元素时,为什么它没有给出运行时错误?

  2. 2

    当我尝试从不存在的HashSet中删除元素时,为什么它没有给出运行时错误?

  3. 3

    通过“ apt-get remove”删除软件包时,为什么在此过程中必须(有时)升级其他软件包?

  4. 4

    在不存在的字典中访问元素时,为什么不引发回溯?

  5. 5

    什么时候执行过程中不存在开销?

  6. 6

    在转置过程中处理不存在的条目

  7. 7

    为什么STL向量的迭代器指向不存在的元素?

  8. 8

    什么是不存在的过程?

  9. 9

    为什么有时候tensorflow在训练过程中运行的越来越慢?

  10. 10

    使用forEach在迭代过程中从集合中删除元素

  11. 11

    为什么C ++映射中没有“存在”功能?

  12. 12

    快速模块映射中不存在模块“反应导航”

  13. 13

    Haste模块映射中不存在模块`fs`

  14. 14

    为什么在尝试删除该文件时显然不存在该文件?

  15. 15

    为什么 Inkscape 有时在拖动对象时只会捕捉?

  16. 16

    为什么Rails中不存在用于删除/销毁的直接路径?

  17. 17

    为什么不能删除“不存在”但出现在我的下载目录中的文件?

  18. 18

    当密钥不存在时,为什么没有收到KeyError?

  19. 19

    当密钥不存在时,为什么没有收到KeyError?

  20. 20

    “ ORA-00942:表或视图不存在”仅在存储过程中运行时

  21. 21

    引用创建的易失性表导致过程中不存在错误

  22. 22

    如何在存储过程中声明一行不存在?

  23. 23

    目录不存在时应用崩溃

  24. 24

    为什么运行“ ifconfig”时不存在“ 10.0.2.2”?

  25. 25

    在PHP中,当类不存在时,为什么\ Foo \ Bar :: class不会生成错误?

  26. 26

    创建表时,为什么MySQL数据库中不存在主键字段?

  27. 27

    在迭代过程中添加或删除项目

  28. 28

    为什么现有文件不存在?

  29. 29

    尝试查找不存在的元素时,如何检查Web元素是否显示而不会崩溃?

热门标签

归档