gpt4 book ai didi

java - Hashset 的 Hashcode 和 Equals

转载 作者:IT老高 更新时间:2023-10-28 20:36:11 26 4
gpt4 key购买 nike

请在 Hashset 中澄清我的疑问。考虑以下代码,

class Person
{
String name;

Person(String n)
{
name=n;
}
public String getName()
{
return name;
}

@Override
public boolean equals(Object arg0) {

System.out.println("in equals");

Person obj=(Person)arg0;

System.out.println("1st "+getName());
System.out.println("2nd "+obj.getName());

if(this.getName().equals(obj.getName()))
{
return true;
}
return false;
}


@Override
public int hashCode() {

System.out.println("in hash code");
System.out.println(" value is "+Integer.valueOf(name.charAt(0)));
return Integer.valueOf(name.charAt(0));
}
}

在 main 我有以下代码

Person obj1=new Person("bcd");

Person obj2=new Person("cde");

Person obj3=new Person("abc");

Person obj4=new Person("abc");

现在,如果我将这些对象添加到 hashset

Set<Person> sset=new HashSet<Person>();

sset.add(obj1);
sset.add(obj4);
sset.add(obj2);
sset.add(obj3);

我得到这个输出

in hash code                                                                      
value is 98
in hash code
value is 97
in hash code
value is 99
in hash code
value is 97
in equals
1st abc
2nd abc

问题 1:为什么 equals() 函数只调用一次来检查 obj3 和 obj4 ?为什么不检查其余对象?

问题2:如果答案是因为它们的哈希码相同,那么只有equals才会被调用,那么为什么下面的代码不调用它

sset.add(obj1);
sset.add(obj4);
sset.add(obj2);
sset.add(obj4);

输出是:

in hash code  
value is 98
in hash code
value is 97
in hash code
value is 99
in hash code
value is 97

即使将两个相同的对象添加到具有相同哈希码的哈希集中,它也不会进入 equals() 方法。

问题 3:我迭代了上面的值并打印了内容,但没有调用 hashcode 和 equals。什么时候重写 hashcode 和 equals 方法真的有用?

问题4:hashCode()equals()什么时候调用?

最佳答案

  1. 如果 hashCode 不同,则无需调用 equals
  2. 如果(obj1 == obj2),则无需调用hashCode
  3. 不需要 hashCode 和/或 equals 只是为了迭代 - 你不是在比较对象
  4. 当需要区分对象时。

关于java - Hashset 的 Hashcode 和 Equals,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5396939/

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