-2

この質問にはすでに答えがあります。

インタビューの中でハッシュコードと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;
    }
    }


2 답변


2

あなたが使っている:

  • String#hashCodeそのアルゴリズムが議論されている呼び出し - 参照ここに面白いスレッドを
  • あなたは給料を追加していますint最後の部分のために!!)
  • 最後にそして最も重要なのは、種を使う:各フィールドに素数を掛けて結果を合計する

IDEがどのようにハッシュコードを自動生成してより良いアイデアを得るかを見ることができます。

Eclipseでは:

  • ソースを右クリック(またはalt - shift - S
  • Source
  • Generate 'hashCode()' and 'equals()'...


1

を足し合わせるだけ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それは違います。上記の例で試してみることができます。


  • 覚えておいて、これはインタビューの質問だったので、インタビュアーは直接コーディングされた簡単な解決策を探しているでしょう。外部ライブラリの使用が確実でないことが必要でした。 - Andrew Fielden
  • @AndrewFielden:後で気づいたので、もう少し詳しく説明します。 - Sanjay T. Sharma

リンクされた質問


関連する質問

最近の質問