【发布时间】:2016-05-11 11:13:19
【问题描述】:
当我迭代映射 (HashMap,HashTable,ConcurrentHashMap) 时,当我尝试删除特定条目时,在迭代中它仍然使用空值打印它。但并不是每一个条目都会发生这种情况。
public class Test {
public static void main(String[] args) {
ConcurrentHashMap<String, String> map = new ConcurrentHashMap<String, String>();
map.put("Pujan", "pujan");
map.put("Swati", "swati");
map.put("Manish", "manish");
map.put("Jayant", "pujan");
System.out.println(map);
for (String string : map.keySet()) {
System.out.println(string+","+map.get(string));
map.remove("Manish");
}
System.out.println(map);
}
}
输出:
{Jayant=pujan, Swati=swati, Manish=manish, Pujan=pujan}
Jayant,pujan
Swati,swati
Pujan,pujan
{Jayant=pujan, Swati=swati, Pujan=pujan}
??第二个场景
//map.remove("Manish");
map.remove("Swati");
输出:
{Jayant=pujan, Swati=swati, Manish=manish, Pujan=pujan}
Jayant,pujan
**Swati,null**
Manish,manish
Pujan,pujan
{Jayant=pujan, Manish=manish, Pujan=pujan}
【问题讨论】:
-
为什么
map.remove在for循环内? -
你不应该在迭代它时使用
Map.remove。大多数时候你会得到一个并发修改异常,如果没有,你会得到不可预知的结果。 -
@RealSkeptic - 他正在使用 ConcurrentHashMap!!
-
@StephenC 该问题还询问了
HashMap和HashTable- 这将在哪里失败 - 对于ConcurrentHashMap,将产生不可预测的结果。
标签: java collections