1 回答
TA贡献1860条经验 获得超9个赞
您已经爱上了 Check-Then-Act 反模式。它意味着检查条件(如密钥的存在),然后对其采取行动(如调用get),忽略条件可能在其间发生变化的可能性。
因此,您在迭代时遇到了一个特定的键conMap.keySet(),但在您调用conMap.get(objId)时,该键可能不再位于映射中,返回时会报告这一点null。
强烈建议使用具有合适hashCode/equals实现的键类型,这样您就无需遍历整个地图来查找匹配项,而是可以使用单个get(id).
但是,当您必须遍历映射并需要值时,请遍历条目集而不是键集。
public void doSomething(MyObj id){
// see https://stackoverflow.com/q/322715/2711488
List<Map<String, List<String>>> mapsList = new ArrayList<>();
for(Map.Entry<MyObj, Map<String, List<String>>> e: conMap.entrySet()){
if(e.getKey().key1.equals(id.key1)){
mapsList.add(e.getValue());
}
}
for(Map<String, List<String>> map: mapsList){
synchronized(map) {
//...
}
}
}
添加回答
举报
