gpt4 book ai didi

java - 为什么当我覆盖 hashcode 并从 hashmap 获取值时需要覆盖 equals

转载 作者:行者123 更新时间:2023-12-01 16:56:40 24 4
gpt4 key购买 nike

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")));
}
}

In this code I am overriding hashcode() and equals() function

当我运行此代码时,我得到以下输出:

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

when I override only hashCode() function and comment equlas() method I get following output:

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

Need explanation for this behaviour as the hash code computed in both scenarios is same but it gives null in 2nd case.

最佳答案

需要对此行为进行解释
这正是我应该期望的预期行为。为什么?
关于 hascode 有一个问题,那就是你不能 100% 保证唯一对象的唯一性。这意味着在某些情况下不同的对象可以有相似的hascode。

HashMap 的实现牢记了这一点。因此,当您传递 key 时,它们总是比较 hascode 然后检查相等性(引用检查然后使用 equals() 方法)。如果没有找到返回null。您可以查看源代码:

if (e.hash == hash &&
((k = e.key) == key || (key != null && key.equals(k))))

此代码块表示:

  • 哈希(hascode)对于给定键和输入键必须相同

  • 给定的键和输入键需要是相同的对象(相同的引用)OR它们需要通过equals()方法相等

在您的情况下,当您注释 equals 方法时,将使用父类(super class)的 equals() 方法的默认实现,我猜它实际上仅检查引用相等性。所以

DemoHashSet obj1 = new DemoHashSet("key1", "121990", "male");

及以后

 new DemoHashSet("key1", "121990", "male") //ins hmap.get()

不引用同一个对象,因此 equals() 返回 false,而 get() 返回 null,因为找不到匹配项关键。
当您的 equals() 方法根据您的实现而存在时,您就告诉这些对象相等,因为它们具有相同的名称。

hashcode 不能保证并且不相等。

关于java - 为什么当我覆盖 hashcode 并从 hashmap 获取值时需要覆盖 equals,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31823599/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com