我想,反覆HashMap
並改寫一些元素與其它地圖,但是我有以下問題:的HashMap的keySet變化不會反映在地圖
@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操作。
它說「地圖的變化反映在集合中,反之亦然」。那麼爲什麼它的行爲是這樣,最重要的:我如何克服它,使兩個圖只包含修改後的鍵和非空值?
UPDATE: 我的朋友做了關於Java 1.5.0.19(我有1.7.0_03,同樣發生在1.5.0_21)該項測試,並得到了正確的輸出:
initial
10
another
10
UPDATE2: 哦,他沒有實現的hashCode /等於,所以第一次更新是無關緊要
你正在改變的關鍵...這永遠不會工作,因爲你的第二個呼叫map.get(我)是基於比第一個 – Fido 2012-07-05 15:29:52
這樣一個不同的密鑰是什麼意思javadoc中的這一部分:「更改地圖反映在集合中,反之亦然「? – 2012-07-05 15:31:22
集合中的變化與集合中元素的變化不同 – Fido 2012-07-05 15:32:31