現在、Object Id をキー、1 を値として HashMap を作成しています。メソッドは Object/Id を要求し、一致するキーがあるかどうかを確認します。
それは大丈夫ですか?または、より良い代替手段はありますか?
現在、Object Id をキー、1 を値として HashMap を作成しています。メソッドは Object/Id を要求し、一致するキーがあるかどうかを確認します。
それは大丈夫ですか?または、より良い代替手段はありますか?
「である」が何を意味するかによります。
オブジェクトID(つまりobject1 == object2
)を意味する場合は、説明した方法でIdentityHashMapを使用できます。
オブジェクトの等価性(つまり)を意味する場合は、HashMap をいじる代わりにHashSetobject1.equals(object2)
を使用できます。
オブジェクトが Objectのデフォルトの実装equals()
とhashCode()
Object から継承されたものを使用する場合、これは違いのない違いです。デフォルトでは、オブジェクトの等価性がオブジェクト ID として実装されます。
Phill SacreはList.contains()
. Set または Map の実装を使用する必要はありません。List (例: ArrayList
) を使用できます。contains で短いリストを介して線形検索を実行する方が、ハッシュ構造を維持するよりもコストがかからないことに気付くかもしれません。
List.contains (Object)はあなたが望むことをしますか?
ただし、何をするにしても、常にequals() と hashCode() を実装する必要があります。
他の人が指摘したように、実際にはそのために HashSet を使用することも、任意の種類のセットを使用することもできます。独自のオブジェクトを使用する場合は、 ( hashCode()
HashSet に必要) およびequals()
(両方をオーバーライドする場合は、どのセットでも機能する) をオーバーライドするようにしてください。
それで大丈夫です。または、 HashSetを使用することもできます。
編集:
次の 2 つの方法でオブジェクトを比較できます。
デフォルトのObject
比較は参照によって行われ、Object
クラスに実装されます。
オブジェクトの階層内のいずれかのクラスがこのデフォルトの実装をオーバーライドする場合、カスタム比較を行います。これが発生した場合は、 もオーバーライドする必要がありますhashcode
。
これを考えると、参照によってオブジェクトを比較したいが、同等性のカスタム実装がある場合は、IdentityHashMap ELSEを
使用する必要があります。 HashSet
現在の実装を維持したい場合もHashMap
問題ありません。HashSet は HashMap で内部的に実装されます。ただし、値を 1 に設定する代わりに、 で設定しますnull
。
正しいデータ構造の問題もあります。ハッシュ構造のList
代わりに使用できます。使用するデータ構造のタイプはユーザー次第です。これは、コレクションに入れる予定のオブジェクトの数、アクセスの数、挿入など、多くの考えに依存します。
これは本質的に HashSet が行うことですが、実装を繰り返す代わりに HashSet を使用します。
ブルーノが提案するように、オブジェクトの固定リストにセットを使用してから を呼び出すことができますcontains()
。
を使用する場合は、この場合の身元チェックのために内部で使用されるHashSet
オブジェクトの実装をオーバーライドしていることを確認してください。hashCode()
(前回私が JRE を掘り下げたとき、a を使用するというあなたのアプローチは、とにかくHashMap
a が行ったこととまったく同じでした!)HashSet
「別のリストから」の定義は何ですか? オブジェクトの等価性ですか?次に、あなたが持っているものは良いですが、より明確にするために (Hash)Set を検討するかもしれません。
参照の等価性が必要な場合は、検索するか、 of をIdentityHashMap
使用しますHashSet
IdentityHashcode