0

我有一个我无法解决的错误。我的 HashMap 有一些条目,但我无法通过密钥检索它们。键确实有 hashCode 和 equals 被覆盖,但据我所知,它们工作正常。他们正在使用 eclipse 的生成器实现以下代码证明了这个问题。HashMap 拒绝承认它包含自己提供的密钥。get 等其他方法也不起作用。

HashMap<SimpleTurn, Turn> turns = node.turns;
System.out.println("verifying HashMap turns"); 
System.out.println(" class : "+turns.getClass().getName()+" "+turns.getClass().getCanonicalName());
for(SimpleTurn sp : turns.keySet()){
    System.out.println("Am I equal to myself : "+sp.equals(sp));
    System.out.println("Do I belong to my collection : "+turns.containsKey(sp));
}

请注意,我明确尝试检查 equals 的实现,它似乎工作正常。上述代码的输出是:

verifying HashMap turns
class : java.util.HashMap java.util.HashMap
Am I equal to myself : true
Do I belong to my collection : false
Am I equal to myself : true
Do I belong to my collection : false
Am I equal to myself : true
Do I belong to my collection : false

这种行为在整个代码中是一致的,什么可能导致这种行为?关于我应该寻找什么的任何提示?非常感谢

4

1 回答 1

1

hashCode只有当您返回的值与第一次插入密钥时使用的值不同时,您所描述的行为才会发生。例如

public class Main {     
    public int count = 0;
    public static void main(String[] args) throws Exception {   //Read user input into the array
        HashSet<Main> set = new HashSet<>();
        Main main = new Main();
        main.count = 3;

        set.add(main);
        main.count = 2; // changes what hashCode() returns 

        System.out.println(set.contains(main)); // prints false
    }

    public int hashCode() {
        return count;
    }
}

A在其底层实现中HashSet使用 a 。HashMap

密钥存储在由 的原始hashCode()值定义的位置3。我们修改对象并尝试检查是否Set包含它。该contains()方法将再次调用该hashCode()方法,该方法返回2,并检查是否存在使用该值定义的元素(桶)。它没有找到任何东西,所以返回false

在将它们添加到Map.

于 2013-09-08T19:39:33.993 回答