ソフトウェアエンジニア現役続行

雑多なことを綴ります

hashCodeメソッドとequalsメソッド

JavaのhashCodeメソッドとequalsメソッドは以下のような条件を満たしてないといけません。

Condition Required Not Required(But Allowed)
x.equals(y) == true x.hashCode() == y.hashCode()
x.hashCode() == y.hashCode() x.equals(y) == true
x.equals(y) == false x.hashCode() == y.hashCode()
x.hashCode() != y.hashCode() x.equals(y) == false

いまSJC-PをJava6で取得するためにSCJP Sun Certified Programmer for Java 6 Study Guideを読んで勉強しているのですが、以下のような問題がありました。

class SortOf {  
    String name;  
    int bal;  
    String code;  
    short rate;  
    public int hashCode() {  
        return (code.length() * bal);  
    }  
    public boolean equals(Object o) {  
        //ここにコードを挿入する
    }  
}  

以下のどれを挿入すると、このクラスにおけるequals()とhashCode()の契約を満たすでしょうか?
A: return ((SortOf)o).bal == this.bal;
B: return ((SortOf)o).code.length() == this.code.lenth();
C: return ((SortOf)o).code.length() * ((SortOf)o).bal == this.code.lenth() * this.bal;  
D: return ((SortOf)o).code.length() * ((SortOf)o).bal * ((SortOf)o).rate == this.code.length() * this.bal * this.rate;

CとDが正解となっていました。

Cが正解なのは分かりますが、Dが正解なのが分かりませんでした。JavaRaunchのページによると、本が間違っていることが分かりました。