'equals()'返回false,但是在map中找到了object

时间:2012-11-22 23:13:25

标签: java map equals hashcode

我正在搞乱一些hashCode + equals + Map的东西,发现了一些......很奇怪。

摘录如下:

class Obj {
    String n;
    Obj(String n) {this.n = n;}

    public int hashCode() {return 0;}
    public boolean equals(Object o) {return false;} // no instance of this class 
                                                    // equals any other instance

}

然后我做了这样的事情:

    java.util.Map<Obj,String> map = new java.util.HashMap<Obj,String>();
    Obj o1 = new Obj("1");
    Obj o11 = new Obj("1");
    Obj o2 = new Obj("2");

    map.put(o1,"val 1");
    map.put(o11,"val 2");
    map.put(o2,"val 3");

    p("size = " + map.size()); // obviously 3
    p(map.get(new Obj("1"))); // obviously null     
    p(map.get(o1)); // ...

最后一行是奇怪的部分。最后一行返回val 1。怎么会? equals方法始终返回false。这是因为在调用==之前使用了equals运算符吗?

感谢您的任何见解。

2 个答案:

答案 0 :(得分:7)

HashMap.java中,get方法为:

public V get(Object key) {
    if (key == null)
        return getForNullKey();
    int hash = hash(key.hashCode());
    for (Entry<K,V> e = table[indexFor(hash, table.length)];
         e != null;
         e = e.next) {
        Object k;
        if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
            return e.value;
    }
    return null;
}

if (e.hash == hash && ((k = e.key) == key || key.equals(k)))行确实在调用==之前使用equals比较了密钥。这就是为什么你要消除平等的尝试失败了。

答案 1 :(得分:2)