前提・実現したいこと
Java初学者です。同様の質問が見つからなかったため、質問させてください。
発生している問題・エラーメッセージ
下のコードのように、クラス内で、hashCodeをオーバーライドしました。
その際、タイトルにもあるように、hashCodeの戻り値がintの最大値を超えてしまいました。そしてintの最大値を超えた場合、intの最低値から再び始まることは確認しました。
しかし、この場合問題はないのでしょうか?
というのもhashCode()の戻り値が大きすぎた場合、intで一周してしまい、equalsでは一致しないが、hashCodeが一致してしまうことが起きうるのではないでしょうか?
hashCodeの定義として、equalsが等しいならばhashCodeは等しくなければなりませんが、equalsが等しくなければどちらでも良いことは分かります。しかしのちにhashCodeを使用する際に意図してない分類になってしまうのではないでしょうか?
また、実際プログラミングに慣れている方はhashCodeの戻り値がintの最大値を超えることは意識するのでしょうか?そして、intの最大値を超えないように、primeの値を31より小さい値にするなど工夫するのでしょうか?等しくしたいフィールドが三つ以上になるとどうしても超えてくる気がします。
hashCodeの使い道をまだあまりわかってない部分もありますが、どうぞよろしくお願い致します。
該当のソースコード
private int a;
private double b;
private String c;
@Override
public int hashCode() {
final int prime = 31;
int result = 7;
result = result * prime + this.a;
result = result * prime + Double.hashCode(this.b);
result = result * prime + (this.c != null ? this.c.hashCode() : 0);
return result;
}
試したこと
hashCodeの戻り値を確認する
補足情報(FW/ツールのバージョンなど)
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/21 13:51