約書亞·布洛克說,在有效的Java:重寫的hashCode()方法
你必須在每一個重寫的equals類重載hashCode()()。 如果不這樣做將違反Object.hashCode()的一般合同 ,這將阻止您的類與所有基於散列的集合(包括 HashMap,HashSet和Hashtable)一起正常運行 。
我重寫equals()
方法實現了模糊分數算法比較Match
對象:
public class Match {
private String homeTeam;
private String awayTeam;
public Match(String homeTeam, String awayTeam) {
this.homeTeam = formatTeamName(homeTeam);
this.awayTeam = formatTeamName(awayTeam);
}
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Match that = (Match) o;
final int threshold = 6;
return (computeFuzzyScore(this.homeTeam, that.awayTeam) <= threshold || computeFuzzyScore(this.awayTeam, that.homeTeam) <= threshold) &&
computeFuzzyScore(this.homeTeam, that.homeTeam) > threshold && computeFuzzyScore(this.awayTeam, that.awayTeam) > threshold;
}
// formatTeamName(), computeFuzzyScore() have been left out for brevity.
}
這樣,這些對象是相等的:
Match match0 = new Match("Man.City", "Atl.Madryt");
Match match1 = new Match("Manchester City", "Atlético Madryt");
我應該如何重寫hashCode()
方法來產生相同的值對於這樣的對象?
'match0'和'match'不一樣,是不是他們。所以他們應該最優地不具有相同的'hashCode()'。 'equals()'也不應該返回'true'。 –
您應該在散列碼文檔中發現哈希碼對於等效實例應該是相同的,但可以是不同的哈希碼。這意味着哈希碼只能使用「equals」中使用的變量。 – AxelH
也許這不是一個好主意,使用'equals'的這種實現。你打算只在你的自定義代碼中使用這個「equals」實現,還是你期望標準的JDK類調用你的'equals'方法? – Eran