当前位置: 首页 > 面试题库 >

在地图上进行迭代时,允许对其进行哪些基本操作?

沃念
2023-03-14
问题内容

假设我正在遍历Java中的Map
…我不清楚在遍历该Map的过程中我可以做什么。我猜我在Javadoc中对于Iterator接口remove方法的警告大多感到困惑:

[…]如果在迭代进行过程中以其他方式(而不是通过调用方法)修改了基础集合,则未指定迭代器的行为。

我知道我可以毫无问题地调用remove方法。但是,在遍历Map集合时,我可以:

  1. 使用Map类put方法更改与键关联的值(使用现有键)?

  2. 使用Map类put方法添加新条目(使用新键)?

  3. 使用Map类的remove方法删除条目?

我的猜测是我可能可以安全地执行#1(放入现有密钥),但不能安全地执行#2或#3。

预先感谢您对此的任何澄清。


问题答案:

您可以使用Iterator.remove(),如果使用(Map.Entry的)entrySet迭代器,则可以使用Map.Entry.setValue()。其他一切都关闭了-
您不应该直接更改地图,某些地图不允许上述一种或两种方法。

具体来说,您的(1),(2)和(3) 允许的。

可能 会通过该Map对象来设置现有键的值,但是Set.iterator()文档明确地排除了这一点,它将针对具体实现:

如果在对集合进行迭代时修改了映射(除非通过迭代器自己的remove操作或通过迭代器返回的映射条目上的setValue操作),则迭代的
结果是不确定的 。(添加了重点)



 类似资料:
  • 问题内容: 我有一个(实际上,我使用的是更复杂的POJO,但是为了我的问题而简化了它) 好像 : 我如何遍历此地图,打印出密钥,然后打印人名,然后打印人年龄,例如: A是Map < String ,Person> 的键 B是Person.getName()的名称 C是Person.getAge()的年龄 我可以使用.values()从地图中提取所有值,如HashMap文档中所述,但是我不确定如何获

  • 问题内容: 我跑了 运行该命令后,当尝试在Windows OS上运行任何npm命令时,我不断收到以下内容。 已从删除所有文件 它不起作用。 有什么建议吗? 问题答案: 运行此命令是我的错误。 npm config设置前缀/ usr / local 路径不适用于Windows。此命令在以下位置更改了前缀变量 要访问此目录并对其进行更改,我需要以管理员身份运行cmd。 所以我做了: 以管理员身份运行c

  • 我跑 在运行该命令之后,当尝试在Windows操作系统上运行任何npm命令时,我不断得到以下信息。 已从中删除所有文件 它没有工作。 有什么建议吗?

  • 问题内容: 我跑了 运行该命令后,当尝试在Windows操作系统上运行任何npm命令时,我不断收到以下内容。 已从删除所有文件 那没起效。 有什么建议吗? 问题答案: 运行此命令是我的错误。 npm config设置前缀/ usr / local 路径不适用于Windows。此命令在以下位置更改了前缀变量 要访问此目录并对其进行更改,我需要以管理员身份运行cmd。 所以我做了: 以管理员身份运行c

  • 问题内容: 我正在尝试创建一个菜单栏应用程序,以隐藏桌面图标以及希望进行其他各种操作,主要是为了更多地了解Swift,并且由于某种原因,我无法使其正常工作。当我运行该程序并单击菜单项之一时,什么也没有发生,并且我在控制台中收到此警告: 其他命令也可以,但是我尝试使用“ killall”的任何变体都会吐出类似上面的内容。目前,我的代码如下所示: 我已经和Google上找到的可接受的解决方案进行了多种

  • 问题内容: 我仍然不确定结构复制或引用的规则。 我想在从数组中迭代结构对象时对其进行突变:例如,在这种情况下,我想更改背景颜色,但是编译器对我大吼大叫 问题答案: 是值类型,因此在循环中您正在处理副本。 就像测试一样,您可以尝试以下操作: 斯威夫特3: 斯威夫特2: 在这里,您只需枚举索引,然后直接访问存储在数组中的值。 希望这可以帮助。