当我从当前的bar(Map map)
方法调用foo(...)
方法时,我遇到以下行为,其中bar()表示地图为空。
private void foo() {
Map map = new Map(); // pseudocode
// add (key, value)'s to map
printMap(map); // prints key and values
Map newMap = bar(map);
...
System.out.println(newMap.size()); // returns 0
} // end foo();
private Map bar(Map map) {
printMap(map); // return empty
...
}
编辑:可能是这种打印方式的it.remove()
来电吗?当我删除此电话时,我不再有问题。
private void printMap(Map mp) {
Iterator it = mp.entrySet().iterator();
while (it.hasNext()) {
Map.Entry pairs = (Map.Entry)it.next();
logger.info(pairs.getKey() + " = " + pairs.getValue());
it.remove(); // avoids a ConcurrentModificationException
}
}
答案 0 :(得分:3)
您明确删除了项目:
it.remove();
然后你会有一个空列表。因为您通过引用将map
传递给方法。
要处理异常,请使用try/catch
阻止或throw
异常输出。
为避免并发修改,您应该使用同步机制。
答案 1 :(得分:2)
常见的混淆是将Map
视为对象,就像在C ++中一样。它不是。它是对象的引用。这意味着当您按值传递引用时,只会复制引用。如果将此引用更改为另一个Map,则不会影响调用者。但是,如果您访问该引用并更改该对象的内容,则调用者可以看到此更改。
在你的情况下,你要删除地图的条目,所以当你返回来电时,看到一个空的地图。
BTW打印地图你需要做的就是
private void logMap(Map<?,?> map) {
for(Map.Entry<?,?> entry : map.entrySet())
logger.info(entry); // logs; key = value
}