Java 故障安全迭代器-在迭代过程中删除
若故障安全迭代器创建了底层数据结构的克隆,为什么下面的程序中永远不会打印“D”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
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());
}