4

現在、Object Id をキー、1 を値として HashMap を作成しています。メソッドは Object/Id を要求し、一致するキーがあるかどうかを確認します。

それは大丈夫ですか?または、より良い代替手段はありますか?

4

7 に答える 7

10

「である」が何を意味するかによります。

オブジェクトID(つまりobject1 == object2)を意味する場合は、説明した方法でIdentityHashMapを使用できます。

オブジェクトの等価性(つまり)を意味する場合は、HashMap をいじる代わりにHashSetobject1.equals(object2)を使用できます。

オブジェクトが Objectのデフォルトの実装equals()hashCode()Object から継承されたものを使用する場合、これは違いのない違いです。デフォルトでは、オブジェクトの等価性がオブジェクト ID として実装されます。

Phill SacreList.contains(). Set または Map の実装を使用する必要はありませんList (例: ArrayList) を使用できます。contains で短いリストを介して線形検索を実行する方が、ハッシュ構造を維持するよりもコストがかからないことに気付くかもしれません。

于 2009-01-20T09:47:14.083 に答える
7

List.contains (Object)はあなたが望むことをしますか?

ただし、何をするにしても、常にequals() と hashCode() を実装する必要があります。

于 2009-01-20T09:41:57.137 に答える
5

他の人が指摘したように、実際にはそのために HashSet を使用することも、任意の種類のセットを使用することもできます。独自のオブジェクトを使用する場合は、 ( hashCode()HashSet に必要) およびequals()(両方をオーバーライドする場合は、どのセットでも機能する) をオーバーライドするようにしてください。

于 2009-01-20T09:47:45.673 に答える
3

それで大丈夫です。または、 HashSetを使用することもできます。

編集:

次の 2 つの方法でオブジェクトを比較できます。

  1. 参照による
  2. カスタム

デフォルトのObject比較は参照によって行われ、Objectクラスに実装されます。

オブジェクトの階層内のいずれかのクラスがこのデフォルトの実装をオーバーライドする場合、カスタム比較を行います。これが発生した場合は、 もオーバーライドする必要がありますhashcode

これを考えると、参照によってオブジェクトを比較したいが、同等性のカスタム実装がある場合は、IdentityHashMap ELSEを 使用する必要があります。 HashSet

現在の実装を維持したい場合もHashMap問題ありません。HashSet は HashMap で内部的に実装されます。ただし、値を 1 に設定する代わりに、 で設定しますnull

正しいデータ構造の問題もあります。ハッシュ構造のList代わりに使用できます。使用するデータ構造のタイプはユーザー次第です。これは、コレクションに入れる予定のオブジェクトの数、アクセスの数、挿入など、多くの考えに依存します。

于 2009-01-20T09:41:54.360 に答える
2

これは本質的に HashSet が行うことですが、実装を繰り返す代わりに HashSet を使用します。

于 2009-01-20T09:42:30.440 に答える
1

ブルーノが提案するように、オブジェクトの固定リストにセットを使用してから を呼び出すことができますcontains()

を使用する場合は、この場合の身元チェックのために内部で使用されるHashSetオブジェクトの実装をオーバーライドしていることを確認してください。hashCode()

(前回私が JRE を掘り下げたとき、a を使用するというあなたのアプローチは、とにかくHashMapa が行ったこととまったく同じでした!)HashSet

于 2009-01-20T09:43:57.380 に答える
1

「別のリストから」の定義は何ですか? オブジェクトの等価性ですか?次に、あなたが持っているものは良いですが、より明確にするために (Hash)Set を検討するかもしれません。

参照の等価性が必要な場合は、検索するか、 of をIdentityHashMap使用しますHashSetIdentityHashcode

于 2009-01-20T09:44:36.957 に答える