请澄清我对 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));
}
}
主要我有以下代码
Person obj1=new Person("bcd");
Person obj2=new Person("cde");
Person obj3=new Person("abc");
Person obj4=new Person("abc");
现在,如果我将这些对象添加到哈希集中
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()
and equals()
叫做?