31

単語をデータ構造に入れたいとしましょう。単語がこのデータ構造に含まれているかどうかを確認するために一定時間ルックアップを行いたいとします。私がやりたいのは、単語が存在するかどうかを確認することだけです。HashMapこれには(containsKey()) を使用しますか? HashMapキーと値のペアリングを使用しますが、私の場合は値がありません。もちろん、値に null を使用することもできますが、null でもスペースを取ります。このアプリケーションには、より優れたデータ構造が必要なようです。

コレクションは複数のスレッドで使用される可能性がありますが、コレクションに含まれるオブジェクトは変更されないため、同期/同時実行の要件はないと思います。

誰でも私を助けることができますか?

4

6 に答える 6

51

代わりにHashSetを使用してください。これはSetのハッシュ実装であり、主に正確に記述したもの (アイテムの順序付けられていないセット) に使用されます。

于 2009-05-13T00:57:32.160 に答える
8

通常はSetの実装を使用し、ほとんどの場合HashSetを使用します。同時アクセスが必要な場合、ConcurrentHashSetは、セットに対する安全な反復を含む、安全な同時アクセスを提供するドロップイン置換を提供します。

いずれにせよ、それを構築する1つの場所を除いて、コード全体で単にセットとして参照することをお勧めします。そうすれば、後で必要になった場合に、一方の実装をもう一方の実装にドロップする方が簡単です。

セットが読み取り専用であっても、それを作成したスレッド以外のスレッドで使用されている場合は、安全な公開について考える必要があります(つまり、他のスレッドがセットを一貫した状態で認識していることを確認してください。覚えておいてください。コンストラクターであっても、メモリへの書き込みは、これを確実にするための手順を実行しない限り、期待するときまたは期待する他のスレッドで他のスレッドが使用できることが保証されません。これは、次の両方で実行できます。

  • セットへの唯一の参照がfinalフィールドにあることを確認してください;
  • セットを変更するスレッドがないことが本当に真実であることを確認してください。

Collections.unmodizableSet()ラッパーを使用すると、後者を確実に行うことができます。これにより、指定されたセットの変更不可能なビューが得られます。したがって、セットへの他の「通常の」参照がエスケープされない限り、安全です。

于 2009-05-13T01:36:08.403 に答える
7

おそらくjava.util.Setを使用したいと思うでしょう。実装には、HashMap に相当する Set であるjava.util.HashSetが含まれます。

コレクションに含まれるオブジェクトが変わらない場合でも、同期が必要になる場合があります。Set が別のスレッドに渡された後、新しいオブジェクトを Set に追加する必要がありますか? その場合は、Collections.synchronizedSet()を使用して Set をスレッドセーフにすることができます。

値を持つ Map があり、Map を Set として扱いたいだけのコードがある場合は、Map.entrySet() を使用できます (ただし、entrySet は Map 内のキーの Set ビューを返すことに注意してください。 Map が変更可能な場合は、entrySet によって返されるセットを介して Map を変更できます)。

于 2009-05-13T01:05:47.927 に答える
6

あなたが述べたパフォーマンスを得るために、おそらく HashSet の Set インターフェイスを実装する Collection を使用したいと考えています。http://java.sun.com/javase/6/docs/api/java/util/Set.htmlを参照してください。

于 2009-05-13T00:58:40.083 に答える
1

s以外では、状況によっては aを withSetに変換したい場合があります(一部の s は値を許可しないため、)。MapSetCollections.newSetFromMap(Map<E,Boolean>)MapnullBoolean

于 2009-05-13T01:02:36.717 に答える
-1

誰もが言ったように、HashSet はおそらく最も単純なソリューションですが、HashSet で一定時間ルックアップを行うことはできず (エントリがチェーンされている可能性があるため)、エントリごとにダミー オブジェクト (常に同じ) を格納します...

ここにあるデータ構造のリストについては、ニーズにより適したものを見つけることができるかもしれません。

于 2009-05-13T11:47:36.887 に答える