equals
JavaでhashCode()をオーバーライドする場合、 (Object)メソッドをオーバーライドする必要がありますか?
equals
をオーバーライドし、オーバーライドする必要があるという契約を読みましたhashCode
。その逆は本当ですか?
オブジェクトを比較せず、equals メソッドを使用しないシナリオを考えていました。
equals
JavaでhashCode()をオーバーライドする場合、 (Object)メソッドをオーバーライドする必要がありますか?
equals
をオーバーライドし、オーバーライドする必要があるという契約を読みましたhashCode
。その逆は本当ですか?
オブジェクトを比較せず、equals メソッドを使用しないシナリオを考えていました。
はい、オーバーライドする必要があります。をオーバーライドする必要があると思われる場合は、オーバーライドするhashCode()
必要がありequals()
、その逆も同様です。hashCode()の一般的な規約は次のとおりです。
Java アプリケーションの実行中に同じオブジェクトに対して複数回呼び出された場合は常に、オブジェクトの equals 比較で使用される情報が変更されていない限り、hashCode メソッドは一貫して同じ整数を返す必要があります。この整数は、あるアプリケーションの実行から同じアプリケーションの別の実行まで一貫性を保つ必要はありません。
equals(Object) メソッドに従って 2 つのオブジェクトが等しい場合、2 つのオブジェクトのそれぞれで hashCode メソッドを呼び出すと、同じ整数結果が生成される必要があります。
equals(java.lang.Object) メソッドに従って 2 つのオブジェクトが等しくない場合、2 つのオブジェクトのそれぞれで hashCode メソッドを呼び出すと、異なる整数結果が生成される必要はありません。ただし、プログラマーは、等しくないオブジェクトに対して個別の整数結果を生成すると、ハッシュテーブルのパフォーマンスが向上する可能性があることに注意する必要があります。
Joshua Bloch は、彼の「Effective Java」の第 3 章で明確にしています。これらは常に一緒にオーバーライドする必要があります。