7

重複の可能性:
JavaでequalsとhashCodeをオーバーライドする

カスタムクラスのPersonにハッシュコードとequalsを実装することになっています。人はで構成されています

ファーストネーム

苗字

私はequalsとhashcodeを実装して、firstnamelastnameを持つ2人がequalsに対してtrueを返し、Hashmapによって受け入れられるようにすることになっています。私は次のようなPersonクラスを実装しました:

public class Person {


    String firstname;
    String lastname;
    public Person(String firstname, String lastname) {
        this.firstname = firstname;
        this.lastname = lastname;
    }

    @Override
    public int hashCode() {
        // TODO Auto-generated method stub
        return firstname.hashCode()+lastname.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        // TODO Auto-generated method stub
    Person u=(Person) obj;

        return u.firstname.equals(firstname) && u.lastname.equals(lastname);
    }

}

ここでのハッシュコードの実装は正しいですか?期待どおりの結果が得られていますが、この実装が正しいかどうか知りたいですか?

4

4 に答える 4

8

objがnullまたはaPersonでない場合は例外がスローされるため、equalsメソッドにはわずかな問題があります。したがって、equalsの先頭に次を追加する必要があります。

if(obj==null || !(obj instanceof Person))
   return false;
于 2013-02-01T14:19:15.730 に答える
4

ここequalsに適切なhashCode実装についての優れた議論があります:

a.equals(b)の場合は常に、a.hashCode()はb.hashCode()と同じである必要があります

これが重要な唯一のルールです。この1つのルール以外に正しい実装はありません。パフォーマンスとハッシュの衝突に関しては、良いハッシュコードと悪いhashCodeハッシュコードがありますが、それはまったく別のトピックです。

a.equals(b)の場合、との両方でfirstname.hashCode()+lastname.hashCode()同じ値になるはずなので、コードはそのルールに従って正しいように見えます。ab

于 2013-02-01T14:16:25.927 に答える
1

あなたのコードは大丈夫です。文字列には優れたハッシュアルゴリズムがあり、Javaで複数の文字列をハッシュするには、ハッシュを追加するだけが最も効率的な方法です。

于 2013-02-01T14:20:40.417 に答える
0

hashCode()動作するという意味で正しいです(文字列のfirstnameとlastnameがnullでないことを前提としています)-つまり、メソッドは。を返しますint。それが良い解決策であるかどうかは、はるかに長い話です。上記の検索フィールドを使用して確認できると確信しています;)

これは私がしばらく前に尋ねた興味深い質問ですhashCode()hashCode()をオーバーライドするときに乗数としてより大きな素数を使用する

于 2013-02-01T14:20:24.460 に答える