任何HashMap方法都不会调用重写的hashCode()函数

时间:2014-10-15 19:46:34

标签: java hashmap equals hashcode

我在下面给出的班级Supplier中覆盖了hashCode()和equals()方法。

public class Supplier {

private final String name;

public Supplier(String name) {
    this.name = name;
}

public String getName() {
    return name;
}

@Override
public int hashCode() {        
    char[] charArray = name.toCharArray();
    int sumOfchars = 0;
    for (char element : charArray) {
        sumOfchars += element;
    }
    return 51 * sumOfchars;
}

@Override
public boolean equals(Object o) {        
    if (o == null) {
        return false;
    }
    if (getClass() != o.getClass()) {
        return false;
    }
    final Supplier other = (Supplier) o;
    return this.name.equals(other.name);
}
}

此类的对象将添加到HashMap中,其中name字段为Key。

Supplier s1 = new Supplier("supplierA");
Supplier s2 = new Supplier("supplierB");
Map<String, Supplier> supplierMap = new HashMap<>();
supplierMap.put(s1.getName(), s1);
supplierMap.put(s2.getName(), s2);
supplierMap.containsKey("supplierA"));

但是,当我put()get()一个元素时,我的被覆盖的hashCode()方法不会被调用。使用equals()contains(Key key)的情况也是如此。在HashMaphashCode()的情况下,我认为put会在内部调用get()。在equals的情况下调用contains()。请注意这点。

2 个答案:

答案 0 :(得分:6)

当您在putHashMap时,会在密钥上调用hashCode()方法,而不是值。因此,在这种情况下,来自hashCode String的{​​{1}}会在s1.getName()s2.getName()上被调用。

答案 1 :(得分:1)

您正在使用&#39; name&#39;的java.lang.String值作为你的密钥 - 因此你的对象的哈希码方法将不会被调用。

如果你要做Map&lt; Supplier,Object&gt;或其他什么,然后它会被称为。