我在下面给出的班级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)
的情况也是如此。在HashMap
和hashCode()
的情况下,我认为put
会在内部调用get()
。在equals
的情况下调用contains()
。请注意这点。
答案 0 :(得分:6)
当您在put
中HashMap
时,会在密钥上调用hashCode()
方法,而不是值。因此,在这种情况下,来自hashCode
String
的{{1}}会在s1.getName()
和s2.getName()
上被调用。
答案 1 :(得分:1)
您正在使用&#39; name&#39;的java.lang.String值作为你的密钥 - 因此你的对象的哈希码方法将不会被调用。
如果你要做Map&lt; Supplier,Object&gt;或其他什么,然后它会被称为。