いくつかの要素を繰り返しHashMap
て他のマップに書き直そうとしていますが、次の問題があります。
@Test
public void test() {
Map<SubClass, String> map = new HashMap<SubClass,String>();
Map<SubClass, String> anotherMap = new HashMap<SubClass,String>();
map.put(new SubClass(), "10");
for(SubClass i : map.keySet()) {
System.out.println(i); // initial (because toString is implemented)
System.out.println(map.get(i)); // 10
// here it's ok...
i.name="another";
System.out.println(i); // another
System.out.println(map.get(i)); // null!
// but here it occurs that map.get(i) returns null!
anotherMap.put(i, map.get(i));
}
for(SubClass i : anotherMap.keySet()) {
System.out.println(i); // another
System.out.println(map.get(i)); // null!
}
}
// SubClass has String name; and hashCode and equals implemented
javadocによると:
java.util.Map.keySet()
このマップに含まれるキーの Set ビューを返します。セットはマップに支えられているため、マップへの変更はセットに反映され、その逆も同様です。セットに対する反復の進行中にマップが変更された場合 (反復子自体の削除操作を除く)、反復の結果は未定義です。セットは、Iterator.remove、Set.remove、removeAll、retainAll、および clear 操作を介して、マップから対応するマッピングを削除する要素の削除をサポートします。add または addAll 操作はサポートされていません。
「マップへの変更はセットに反映され、その逆も同様です」と書かれています。では、なぜこのように動作し、最も重要なのか: 両方のマップに変更されたキーと null 以外の値のみが含まれるようにするにはどうすればよいでしょうか?
更新: 私の友人は Java 1.5.0.19 (私は 1.7.0_03 を持っていますが、1.5.0_21 でも同じことが起こります) でこのテストを行い、正しい出力を得ました:
initial
10
another
10
UPDATE2: ああ、彼は hashCode/equals を実装していないので、最初の更新は関係ありません