0

以下の例で機能するハッシュコードを実装する方法を理解するのに苦労しています。

私は2つのクラスを持っています:

Class A
{
} 

Class B 
{
  protected List<A> constitutingObjects;
}

オブジェクト A が B.constitutingObects の一部である場合、オブジェクト A はオブジェクト B と等しいため、既に同等にオーバーライドされています。私が抱えている問題は、これにハッシュコードを実装する方法がわからないことです。

何か案は ?

ありがとう。

4

2 に答える 2

1

TL;DR: あなたがやろうとしていることは意味がありません。一歩下がって、より大きなタスクに別の方法で取り組むようにしてください。

A が B.constitutingObects の一部である場合、クラス A はクラス B と等しいように既にオーバーライドされています。

それは非常に悪い考えのように聞こえます。これらのオブジェクトが何を表しているのかを判断するのは困難ですが、コレクションを含むものはそのコレクションの要素と論理的に同等ではありません。買い物リストは「牛乳」と同等ではありません。

ドキュメントで指定された要件に従う必要があることを忘れないでください。java.lang.Object他の多くのコードは、これらの保証に依存します。

hashCode定数を返すだけじゃないと実装は基本的に無理です。2 つの等しいオブジェクトのハッシュ コードは等しくなければなりません。これは、 の任意のインスタンスのハッシュ コードが のすべての要素ClassBハッシュ コードと等しくなければならないことを意味します。つまり、これらの要素のすべてが同じハッシュ コードを持たなければならないことを意味します。 . インスタンスがコンテナが何であるかを何らかの形で「知っていた」場合を除き、これがどのように可能になるかはわかりません。constitutingObjectsClassA

于 2012-08-22T16:26:05.240 に答える
0

equalsJavaで定義するhashCode場合、2 つのクラスが等しいかどうかをテストするのではなく、メソッドに従って、同じタイプ (クラス) の 2 つのオブジェクトが等しいかどうか、equalsまたはそれらが同じ「バケット」にある可能性があるかどうかを実際にテストしています (論理的にオブジェクトのグループ) に従いますhashCode

したがって、x と y がタイプ A の 2 つのオブジェクトである場合:

A x = new A();
A y = new A();
  • x.equals(b)true の場合は、次のx.hashCode()値に等しくなければなりませんy.hashCode()
  • if x.hashCode() == y.hashCode()thenx.equals(y)は true または false
于 2012-08-22T16:24:20.630 に答える