请帮我澄清一下关于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被调用时才会被检查,那么为什么下面的代码不会调用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()
方法?
.equals
的,所以我认为答案也应该和这个有关。 (是的,你是对的,我应该添加一个注释而不是直接修改答案。) - Paŭlo Ebermann