0

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

EDIT:この印刷メソッドの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++ のようにオブジェクトと考えることです。そうではない。オブジェクトへの参照です。つまり、値で参照を渡すと、参照のみがコピーされます。この参照を別の Map に変更しても、呼び出し元には影響しません。ただし、参照にアクセスしてオブジェクトの内容を変更すると、呼び出し元はこの変更を見ることができます。

あなたの場合、マップのエントリを削除しているので、呼び出し元に戻ると空のマップが表示されます。

ところで、地図を印刷するために必要なことは

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