この質問にはすでに答えがあります。
インタビューの中でハッシュコードと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
)Source
Generate 'hashCode()' and 'equals()'...
を足し合わせるだけhashCode
本当に良い考えではありません。そこにライブラリがあります(例えば。プロジェクトロンボクこれはあなたのためにこれを行います。あるいは、単にIDEを作成するようにIDEに要求することもできます。例えばEclipseにはオプションがありますを生成するhashCode
クラスのフィールドに基づきます。
少し外挿します。次のものがあるとしましょう。hashCode
s:
name.hashCode() = 200
job.hashCode() = 400
salary = 1000000
しかし、次のようなユニークな従業員がいるかもしれません。hashCode
s:
name.hashCode() = 400
job.hashCode() = 200
salary = 1000000
ご覧のとおり、ここには2人の異なる従業員がいますが、最終的には同じ従業員になります。hashCode
両方のための。の望ましい特性hashCode
ハッシュしているエンティティができるだけ均一に分散されるようにすることです。
あなたがすべての "良い"を見ればhashCode
実装では素数との乗算に気づくでしょう。これにより、個々のhashCodeの合計が同じになっても、全体としてはhashCode
それは違います。上記の例で試してみることができます。