2 つの int の単純なコンテナー オブジェクトの equals メソッドと hashcode メソッドをオーバーライドしています。各 int は、別のオブジェクトのインデックスを反映します (そのオブジェクトが何であるかは関係ありません)。クラスのポイントは、2 つのオブジェクト間の接続を表すことです。
接続の方向は重要ではないため、equals メソッドは、2 つの int がオブジェクト Eg 内のどの方向にあるかに関係なく、true を返す必要があります。
connectionA = new Connection(1,2);
connectionB = new Connection(1,3);
connectionC = new Connection(2,1);
connectionA.equals(connectionB); // returns false
connectionA.equals(connectionC); // returns true
これが私が持っているものです(整数のソースコードから変更されています):
public class Connection {
// Simple container for two numbers which are connected.
// Two Connection objects are equal regardless of the order of from and to.
int from;
int to;
public Connection(int from, int to) {
this.from = from;
this.to = to;
}
// Modifed from Integer source code
@Override
public boolean equals(Object obj) {
if (obj instanceof Connection) {
Connection connectionObj = (Connection) obj;
return ((from == connectionObj.from && to == connectionObj.to) || (from == connectionObj.to && to == connectionObj.from));
}
return false;
}
@Override
public int hashCode() {
return from*to;
}
}
これは機能しますが、私の質問は次のとおりです。これを達成するためのより良い方法はありますか?
私の主な心配は、 hashcode() メソッドが乗算して同じ数に等しくなる 2 つの整数に対して同じハッシュコードを返すことです。例えば
3*4 = 12
2*6 = 12 // same!
ドキュメントhttp://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html#hashCode()には、次のように記載されています。
equals(java.lang.Object) メソッドに従って 2 つのオブジェクトが等しくない場合、2 つのオブジェクトのそれぞれで hashCode メソッドを呼び出すと、異なる整数結果が生成される必要はありません。ただし、プログラマーは、等しくないオブジェクトに対して個別の整数結果を生成すると、ハッシュテーブルのパフォーマンスが向上する可能性があることに注意する必要があります。
一致するハッシュコードの数を減らす簡単な方法を誰かが見ることができれば、私は答えに感謝します.
ありがとう!
ティム
PS私は、いくつかのインポートの煩わしさを引き起こす可能性のある java.sql.Connection があることを認識しています。このオブジェクトには、実際にはアプリケーション内でより具体的な名前が付けられていますが、簡潔にするために、ここでは Connection に短縮しています。