この質問にはすでに答えがあります。
インタビューの中でハッシュコードとequalsメソッドの実装を効率的な方法で示すように依頼されたので、以下のpojoを作成しましたが、インタビュアーはこれは衝突を招く可能性があるので正しくない最良の実装ではないと述べました、以下のハッシュコードの実装が正しいかどうかを教えてください。
public class Emp {
String name, job;
int salary;
public Emp(String n, String j, int s) {
this.name = n;
this.job = j;
this.salary = s;
}
public int hashcode() {
return name.hashCode() + job.hashCode() + salary;
}
public boolean equals(Object o) {
Emp e1 = (Emp) o;
return this.name.equals(e1.name) && this.job.equals(e1.job) && this.salary == e1.salary;
}
}
あなたが使っている:
String#hashCodeそのアルゴリズムが議論されている呼び出し - 参照ここに面白いスレッドをint最後の部分のために!!)IDEがどのようにハッシュコードを自動生成してより良いアイデアを得るかを見ることができます。
Eclipseでは:
alt - shift - S)SourceGenerate 'hashCode()' and 'equals()'...
を足し合わせるだけhashCode本当に良い考えではありません。そこにライブラリがあります(例えば。プロジェクトロンボクこれはあなたのためにこれを行います。あるいは、単にIDEを作成するようにIDEに要求することもできます。例えばEclipseにはオプションがありますを生成するhashCodeクラスのフィールドに基づきます。
少し外挿します。次のものがあるとしましょう。hashCodes:
name.hashCode() = 200
job.hashCode() = 400
salary = 1000000
しかし、次のようなユニークな従業員がいるかもしれません。hashCodes:
name.hashCode() = 400
job.hashCode() = 200
salary = 1000000
ご覧のとおり、ここには2人の異なる従業員がいますが、最終的には同じ従業員になります。hashCode両方のための。の望ましい特性hashCodeハッシュしているエンティティができるだけ均一に分散されるようにすることです。
あなたがすべての "良い"を見ればhashCode実装では素数との乗算に気づくでしょう。これにより、個々のhashCodeの合計が同じになっても、全体としてはhashCodeそれは違います。上記の例で試してみることができます。