請澄清我在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