-1

IdentityHashMapオブジェクトのリストを として保存するためにを使用しているソフトウェアを維持していますが、コードのどこでもnull とkeyペアになっているだけで、どちらも参照していないようです。これは私には間違っているように感じます。保存されている値が事実上無視されているのに、なぜマップが使用されているのかわかりません。valuevalue

私の観察に基づいて、マップキーはオブジェクトの保存/比較に使用されており、前の作成者はcontainsマップにデータを入力する前に使用して、重複するオブジェクトを追加しようとしていないことを確認しています。

私は Java のさまざまなデータ構造に精通しているわけではありませんがcollection、この目的には a の方が適していると思います。HashSet順序は関係なく、重複したくないので、私は来ました。

皆さんが入ってくるのは、私の思考プロセスが正しいかどうか疑問に思っていることです. 元の作者がなぜ一緒に行ったのかについて、私が考えていないかもしれない何かがあるのでしょうIdentityHashMapか? HashSet値の組み合わせが必要ない場合、適切な代替手段はありますか? パフォーマンスに関する考慮事項はありますか? (たとえば、このコンテキストではIdentityHashMap実際に a よりも高速ですか?)HashSet

正しいデータ構造でない場合HashSet、それは何ですか?

4

2 に答える 2

5

IdentityHashMapを使用==して、2 つのオブジェクトが同じかどうかを判断しHashSetますequals

Setと同じセマンティクスを持つが必要な場合IdentityHashMapは、 をチェックアウトすることをお勧めしCollections.newSetFromMapます。

Set<T> identityHashSet = Collections.newSetFromMap(new IdentityHashMap<T, Boolean>());
于 2012-12-20T02:04:15.850 に答える
2

here を使用するHashSetと、異なる動作が提供されます。IdentityHashMap同じアイデンティティを持つオブジェクトがマップに存在するかどうかを確認するために が使用されているようです。を使用した場合HashSetcontainsメソッドはequals比較に使用します (asは をIdentityHashMap使用します==)。

問題について詳しく知らないと、なぜこれが行われているのか推測できませんが、質問に答えると、 aHashSetは同等の置換ではありません。

null 値を持つマップを使用するのが正しくないように思われる (少し不潔に思える) ためにセットを使用する場合は、オブジェクトを恒等等価でラップすることを検討してください。その後、それらのequalsメソッドは に委任され==ます。

于 2012-12-20T02:05:13.710 に答える