Hashmap迭代器(keySet和entrySet)给出不同的结果

时间:2014-04-11 07:08:19

标签: java iterator hashmap

我正在尝试从Java 1.6平台将Java Web Start应用程序迁移到Java 1.7平台。服务器端是java 1.6(WebSphere App.Server v8.5)。简而言之,应用程序可用作桌面应用程序,并使用http-client与服务器通信并使用Java序列化传输数据。

我遇到了一个奇怪的案例。如果我在Java 1.6中运行应用程序,一切都按预期正常。在Java 1.7上运行应用程序在调试模式下在服务器端发送数据值对象(DVO由其他DVO和HashMap组成)我可以看到DVO,但是当我想要放置一个新对象时(不是NULL !!!)我看到hashmap的元素大小增加但值为null。

实际的奇怪案例是。如果遍历“KeySet”上的hashmap,则结果与遍历“EntrySet”的结果不同。你可以看到如下结果

HashMap map = getHashMapData();
System.out.println("####Iterate over keySet");
for (Iterator iterator = map.keySet().iterator(); iterator.hasNext();) {
    Object  key = (Object) iterator.next();
    System.out.println(key +" : "+map.get(key));
}
System.out.println("####Iterate over entrySet");
for (Iterator it = map.entrySet().iterator(); it.hasNext();){
    Entry e = (Entry) it.next();
    System.out.println(e.getKey() +":"+ e.getValue());  
}
System.out.println("###sysout map");
System.out.println(map);

输出

####Iterate over keySet
[4/11/14 9:33:14:737 EEST] 00000095 SystemOut     O persistData : null
[4/11/14 9:33:16:017 EEST] 00000095 SystemOut     O processCodeDVO : null
####Iterate over entrySet
[4/11/14 9:33:18:169 EEST] 00000095 SystemOut     O persistData:[27883271, 22644993]
[4/11/14 9:33:19:199 EEST] 00000095 SystemOut     O processCodeDVO:test.dvo.ProcessCodeDVO@a31742c
###sysout map
[4/11/14 9:33:21:414 EEST] 00000095 SystemOut     O {persistData=[27883271, 22644993], processCodeDVO=test.dvo.ProcessCodeDVO@a31742c}

有什么问题和建议?

感谢。

1 个答案:

答案 0 :(得分:0)

终于解决了。出现问题的hashmap有一个元素,之前反序列化。我打开一个pmr,这里的答案是“SDK 6.0.1(也称为Java 1.6)和SDK 7.0(也称为Java 1.7)有不同的APAR代表同样的问题.Java 6.0.1:IV56384将包含在将来的版本中开发人员目前将它包含在IBM SDK 6.0.1 SR8 Java 7.0中:IV36796这在IBM SDK 7.0 SR4或更高版本中已得到修复“。