私が持っている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メソッドをオーバーライドしていない場合も、私は、同じ予期しない結果を取得しています。
私の理解あたりとして、私はオーバーライドしない場合equals
やhashCode
メソッドのみオーバーライドしequals
、メソッドをm1
し、m2
オブジェクトのハッシュ値が異なりますと、別の場所に保存されている必要がありますm1
し、m2
オブジェクト。しかし、この場合には起きていません。
異なるハッシュ値と、私のオブジェクトが同じ場所に保存されている理由はいくつかのいずれかが私を説明していただけますか?
私は、Java 8を使用していました。
ハッシュコードを有する巨大から、範囲Integer.MIN_VALUE
にInteger.MAX_VALUE
しつつ、HashMap
通常はるかに少ないバケットを有する(デフォルトで新たにインスタンス化のために16をHashMap
少なくともOpenJDKの11で)。このように、ハッシュコードが衝突することも予想される、完全に可能だし、複数のオブジェクトが同じバケットに追加されます。しかし、あなたがオーバーライドしていない場合ことに注意してくださいhashCode()
、この動作は完全に偶発的で、頼りにすることはできません。