失败安全迭代器 - 在迭代期间删除

时间:2016-06-03 13:51:09

标签: java collections iterator concurrenthashmap

  

如果失败安全迭代器创建了底层数据结构的克隆,为什么' D'永远不会在下面的程序中打印出来?

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());
}

2 个答案:

答案 0 :(得分:1)

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

ConcurrentHashMap#keySet()

  

返回此地图中包含的键的Set视图。这套是   由地图支持,因此对地图的更改将反映在集合中,并且   反之亦然。该集支持元素删除,删除   来自此地图的相应映射,通过Iterator.remove,   Set.remove,removeAll,retainAll和clear operations。

Read more documentation

See openjdk Implementation

答案 1 :(得分:1)

正如Javadoc for keySet()中所述:

  

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

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