ハッシュ値は異なりますが、まだ、なぜ私のオブジェクトが同じ場所に保存されていますか?

細菌:

私が持っているMovieクラスと私はオーバーライドするhashCode()方法をJavaクラスの下に見つけてください。

public class Movie {

private String actor;
private String name;
private String releaseYr;

public String getActor() {
    return actor;
}

public void setActor(String actor) {
    this.actor = actor;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getReleaseYr() {
    return releaseYr;
}

public void setReleaseYr(String releaseYr) {
    this.releaseYr = releaseYr;
}
@Override
    public int hashCode() {
        return actor.hashCode() + name.hashCode() + releaseYr.hashCode();
    }


}

私は2つの作成したMovieオブジェクトを、オブジェクトの両方のすべてのプロパティ値は同じであり、それらを置きますHashMap以下のコードは、

import java.util.HashMap;

public class Test {

public static void main(String[] args) {

    Movie m1 = new Movie();
    m1.setActor("Akshay");
    m1.setName("Taskvir");
    m1.setReleaseYr("2010");

    Movie m2 = new Movie();
    m2.setActor("Akshay");
    m2.setName("Taskvir");
    m2.setReleaseYr("2010");


    HashMap<Movie, String> map = new HashMap<Movie, String>();

    map.put(m1, "Value of m1");
    map.put(m2, "Value of m2");

}

}

私が期待される結果を取得しています。私はハッシュコードをオーバーライドするように()メソッドとの両方のオブジェクトのそれらは同じインデックスの場所に格納されているように、ハッシュ値が同じである HashMapのテーブルアレイの。以下は、デバッグモードでは期待された結果です。

ここでは、画像の説明を入力します。

しかし、私はのhashCode()メソッドをオーバーライドしますが、それらはHashMapのテーブルの配列の同じインデックスの場所に格納されているのequals()メソッドをオーバーライドしていない場合。私が見ることができますが、ハッシュ値が異なっています以下は私のequalsメソッドであります

@Override
public boolean equals(Object obj) {

    Movie m1 = (Movie) obj;
    boolean result = false;

    if (m1.getActor().equals(this.actor) && m1.getName().equals(this.name)
            && m1.getReleaseYr().equals(this.releaseYr)) {
        result = true;
    }

    return result;
}

デバッグモードでの出力

ここでは、画像の説明を入力します。

私は、その後のequalsとhashCodeメソッドをオーバーライドしていない場合も、私は、同じ予期しない結果を取得しています。

私の理解あたりとして、私はオーバーライドしない場合equalshashCodeメソッドのみオーバーライドしequals、メソッドをm1し、m2オブジェクトのハッシュ値が異なりますと、別の場所に保存されている必要がありますm1し、m2オブジェクト。しかし、この場合には起きていません。

異なるハッシュ値と、私のオブジェクトが同じ場所に保存されている理由はいくつかのいずれかが私を説明していただけますか?

私は、Java 8を使用していました。

Mureinik:

ハッシュコードを有する巨大から、範囲Integer.MIN_VALUEInteger.MAX_VALUEしつつ、HashMap通常はるかに少ないバケットを有する(デフォルトで新たにインスタンス化のために16をHashMap少なくともOpenJDKの11で)。このように、ハッシュコードが衝突することも予想される、完全に可能だし、複数のオブジェクトが同じバケットに追加されます。しかし、あなたがオーバーライドしていない場合ことに注意してくださいhashCode()、この動作は完全に偶発的で、頼りにすることはできません。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=223579&siteId=1