Java 故障安全迭代器-在迭代过程中删除

Java 故障安全迭代器-在迭代过程中删除,java,collections,iterator,concurrenthashmap,Java,Collections,Iterator,Concurrenthashmap,若故障安全迭代器创建了底层数据结构的克隆,为什么下面的程序中永远不会打印“D” Map acMap=new ConcurrentHashMap(); acMap.put(“A”,“yes”); acMap.put(“B”、“Bee”); acMap.put(“C”、“See”); acMap.put(“D”、“Di”); 迭代器itr=acMap.keySet().Iterator(); while(itr.hasNext()) { acMap.删除(“D”); System.out.print

若故障安全迭代器创建了底层数据结构的克隆,为什么下面的程序中永远不会打印“D”

Map acMap=new ConcurrentHashMap();
acMap.put(“A”,“yes”);
acMap.put(“B”、“Bee”);
acMap.put(“C”、“See”);
acMap.put(“D”、“Di”);
迭代器itr=acMap.keySet().Iterator();
while(itr.hasNext())
{
acMap.删除(“D”);
System.out.println(itr.next());
}

根据文档,地图上的任何操作都会反映在键集上,反之亦然。而
KeySet#iterator()
也不会克隆底层ds

:

返回此映射中包含的键的集合视图。布景是 由地图支持,因此地图的更改将反映在集合中,并且 反之亦然。该集合支持元素删除,这将删除 通过迭代器.remove从该映射对应映射, 设置、移除、移除、保留和清除操作

如图所示:

迭代器。。。可能(但不保证)反映施工后的任何修改


您的迭代器反映了构造之后的修改。

它比
keySet()
更具体:这里使用的是
keySet().iterator()。一秒钟后,我看到的
KeySet#iterator()
返回
keytiterator
,它也不会克隆底层ds。:)错过了那部分。谢谢
Map<String, String> acMap = new ConcurrentHashMap<String, String>();
acMap.put("A", "Aye");
acMap.put("B", "Bee");
acMap.put("C", "See");
acMap.put("D", "Di");

Iterator<String> itr = acMap.keySet().iterator();
while(itr.hasNext())
{
    acMap.remove("D");
    System.out.println(itr.next());
}