Java方法传值问题

时间:2013-04-16 06:33:34

标签: java

当我从当前的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
    }
}

2 个答案:

答案 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
}