请澄清我在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");
现在,如果我添加这些对象的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:如果答案是因为它们都具有相同的散列码,才等于将被调用,那么为什么它不叫下面的代码
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()
?
Mmh的......我不读代码格式化这个问题?...难道我格式化mayself明白了吗?...没有,它的后期, 我回家。 N8。 – Daniel 2011-03-22 19:49:43
@保罗Ebermann:当你编辑请不要更改答案的意义 - 它是使用“的hashCode”的措辞,并在第2而不是“等于”故意。如果您不同意我的观点,您可以自由撰写新答案。 – Erik 2011-03-22 22:47:53
@Erik:对不起,因为这个问题是关于调用'.equals',我想答案应该是这个了。 (是的,你说得对,我应该补充注释来代替。) – 2011-03-22 23:02:31