我想,反覆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