0

当我bar(Map map)从当前foo(...)方法调用我的方法时,我遇到了以下行为,其中 bar() 表示 map 为空。

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
    }
}
4

2 回答 2

3

您明确删除项目:

 it.remove();

然后你将有一个空列表。因为您map通过引用传递给该方法。

要处理异常,请使用try/catch块或throw异常输出。

为避免并发修改,您应该使用同步机制。

于 2013-04-16T06:51:06.817 回答
2

一个常见的混淆是将其Map视为一个对象,就像在 C++ 中一样。它不是。它是对对象的引用。这意味着当您通过value 传递引用时,只会复制引用。如果将此引用更改为另一个 Map,则不会影响调用者。但是,如果您访问引用并更改对象的内容,调用者可以看到此更改。

在您的情况下,您正在删除地图的条目,因此当您返回调用者时会看到一个空地图。

顺便说一句,打印地图你需要做的就是

private void logMap(Map<?,?> map) {
    for(Map.Entry<?,?> entry : map.entrySet())
        logger.info(entry); // logs; key = value
}
于 2013-04-16T06:55:30.280 回答