今日代码中循环Map时,采用循环主键
Map<Integer,Map<Integer,String>> status = new HashMap<>();
Set<Integer> set = status.keySet(); if(set.contains(groupid)){ Map<Integer,String> ledNode = status.get(groupid); ledNode.put(winLedId, node); status.put(groupid, ledNode); }else{ Map<Integer,String> newLedNode = new HashMap<>(); newLedNode.put(winLedId, node); status.put(groupid, newLedNode); }
这里如果多个线程调用这个方法,一个对map获取get,一个对map添加put。那么get的会报错,Set<Integer> set = status.keySet();set集合改变了。
所以对map循环时:
1现将map 克隆出来一份,在对其遍历 。
2将set集合转化成一个数组,
Set<Date> set = map.keySet(); Date[] dateArray = new Date[set.size()]; set.toArray(dateArray);
再遍历数组,就不会报错。
还有就是判断一个值是一个map的主键时,也应该注意,
Set<Integer> set = status.keySet();
set.contain(key);
可以直接调用
status.containsKey(key)。
转载于:https://www.cnblogs.com/xlblog/p/8575997.html
相关资源:Java实现Map集合遍历的四种常见方式与用法分析