【发布时间】:2015-08-05 04:43:56
【问题描述】:
public class DemoHashSet {
private String name;
private String dob;
private String gender;
public DemoHashSet(String name, String dob, String gender) {
super();
this.name = name;
this.dob = dob;
this.gender = gender;
}
public String getName() {
return name;
}
public String getDob() {
return dob;
}
public String getGender() {
return gender;
}
@Override
public String toString() {
return name+" "+dob+" "+gender;
}
@Override
public boolean equals(Object o) {
return this.name.equals(((DemoHashSet)o).getName());
}
@Override
public int hashCode() {
int code = this.name.hashCode() + this.dob.hashCode() + gender.hashCode();
System.out.println("Hash Code: "+code);
return code;
}
public static void main(String args[]) throws ParseException {
Map<DemoHashSet, String> hmap = new HashMap<DemoHashSet, String>();
DemoHashSet obj1 = new DemoHashSet("key1", "121990", "male");
DemoHashSet obj2 = new DemoHashSet("key2", "122990", "male");
DemoHashSet obj3 = new DemoHashSet("key3", "123990", "male");
DemoHashSet obj4 = new DemoHashSet("key4", "124990", "male");
DemoHashSet obj5 = new DemoHashSet("key5", "125990", "male");
hmap.put(obj1, "value1");
hmap.put(obj2, "value2");
hmap.put(obj3, "value3");
hmap.put(obj4, "value4");
hmap.put(obj5, "value5");
System.out.println("Get values: ");
System.out.println(hmap.get(new DemoHashSet("key1", "121990", "male")));
System.out.println(hmap.get(new DemoHashSet("key2", "122990", "male")));
}
}
在这段代码中,我重写了 hashcode() 和 equals() 函数
当我运行此代码时,我得到以下输出:
Hash Code: 1457153183
Hash Code: 1457182975
Hash Code: 1457212767
Hash Code: 1457242559
Hash Code: 1457272351
Get values:
Hash Code: 1457153183
value1
Hash Code: 1457182975
value2
当我只覆盖 hashCode() 函数和注释 equlas() 方法时,我得到以下输出:
Hash Code: 1457153183
Hash Code: 1457182975
Hash Code: 1457212767
Hash Code: 1457242559
Hash Code: 1457272351
Get values:
Hash Code: 1457153183
null
Hash Code: 1457182975
null
需要对此行为进行解释,因为在两种情况下计算的哈希码相同,但在第二种情况下会给出 null。
【问题讨论】:
-
equals 和 hashCode 有几点需要考虑。 stackoverflow.com/questions/27581/…
-
这不是与“GetHashCode”问题的重复,因为这是 Java 而那是 C#。虽然相似,但它们适用于不同环境。 (有很多特定于 Java 的重复项。)
-
谁说如果你覆盖哈希码就必须覆盖
equals()?我认为 reverse 是真的:如果你覆盖equals(),你需要覆盖哈希码。
标签: java hashmap equals hashcode