我遇到了一个有趣的问题,我很确定这是一个错误HashMap.考虑以下调试代码(AMap是HashMap,key是传递给此方法的值)
System.out.println("getBValues - Given: " + key);
System.out.println("getBValues - Contains Key: " + AMap.containsKey(key));
System.out.println("getBValues - Value: " + AMap.get(key));
for(Map.Entry<A,HashSet<B>> entry : AMap.entrySet()) {
System.out.println("getBValues(key) - Equal: " + (key.equals(entry.getKey())));
System.out.println("getBValues(key) - HashCode Equal: "+(key.hashCode() == entry.getKey().hashCode()));
System.out.println("getBValues(key) - Key: " + entry.getKey());
System.out.println("getBValues(key) - Value: " + entry.getValue());
}
Run Code Online (Sandbox Code Playgroud)
现在在这个Map中我插入一个键(Channel)和值.后来我尝试将值返回get()并运行此调试代码,在我的例子中给出了这个输出:
getBValues - Given: Channel(...)
getBValues - Contains Key: false <--- Doesnt contain key?!
getBValues - Value: null <--- Null (bad)
getBValues(key) - Equal: true <--- Given key and AMap key is equal
getBValues(key) - HashCode Equal: true
getBValues(key) - Key: Channel(Same...)
getBValues(key) - Value: [] <--- Not null (This is the expected result)
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,直接从HashMap中获取密钥不起作用,但循环通过我获得完全相同的密钥,这意味着它就在那里找不到get().我的问题是什么会导致这个?怎么get()找不到存在的密钥?
我会提供一些示例代码,但我似乎无法独立重现.
有关可能导致此问题的任何建议?
我敢打赌你没有在你的密钥Channel类中正确覆盖equals和hashCode.这可以解释它.
Joshua Bloch告诉你如何在他的"Effective Java"第3章中正确地做到这一点.
http://java.sun.com/developer/Books/effectivejava/Chapter3.pdf
据我所知,我们仍然没有排除它是否与不变性有关。如果你这样做:
aMap.put(key, value);
key.setFieldIncludedInHashCodeAndEquals(25);
Run Code Online (Sandbox Code Playgroud)
然后你就会得到上面的结果。
要排除这种情况,请向我们展示更多代码,或者在上面示例的 for 循环中添加
System.out.println(aMap.get(entry.getKey()));
Run Code Online (Sandbox Code Playgroud)
另外,使用调试器。这样,您就可以查看您的对象是否位于正确的存储桶中。
| 归档时间: |
|
| 查看次数: |
3313 次 |
| 最近记录: |