web-dev-qa-db-ja.com

Javaキーのみで値のないハッシュ構造がありますか?

値を必要とせずにキーをハッシュする構造を探しています。照会すると、キーが見つかった場合はtrueを返し、それ以外の場合はfalseを返します。私はHashtable<MyClass, Boolean>に似たものを探しています。ただし、挿入にはキーのみが必要で、クエリは常にtrueまたはfalseを返し、nullは返しません。

37
Obediah Stane

Javaの HashSetJava 8 )が必要です。

公式ドキュメント の説明は次のとおりです。

このクラスは、ハッシュテーブル(実際にはHashMapインスタンス)に基づくSetインターフェースを実装します。セットの反復順序については保証されません。特に、順序が一定であるとは限りません。このクラスはnull要素を許可します。

このクラスは、ハッシュ関数がバケット間で要素を適切に分散すると仮定して、基本的な操作(追加、削除、包含、サイズ)に対して一定の時間パフォーマンスを提供します。このセットを反復処理するには、HashSetインスタンスのサイズ(要素の数)とバッキングHashMapインスタンスの「容量」の合計(バケット数)に比例した時間が必要です。したがって、反復のパフォーマンスが重要な場合は、初期容量を高くしすぎないように(または負荷係数を低くしすぎないように)設定することが非常に重要です。

この実装は同期されていないことに注意してください。複数のスレッドが同時にハッシュセットにアクセスし、少なくとも1つのスレッドがそのセットを変更する場合は、外部で同期する必要があります。これは通常、セットを自然にカプセル化するいくつかのオブジェクトで同期することによって行われます。そのようなオブジェクトが存在しない場合は、Collections.synchronizedSetメソッドを使用してセットを「ラップ」する必要があります。これは、セットへの偶発的な非同期アクセスを防ぐために、作成時に行うのが最適です。

Set s = Collections.synchronizedSet(new HashSet(...));

このクラスのイテレータメソッドによって返されるイテレータはフェイルファストです。イテレータが作成された後、イテレータ自身のremoveメソッド以外の方法でセットが変更されると、イテレータはConcurrentModificationExceptionをスローします。したがって、同時変更に直面した場合、イテレーターは、将来の不確定な時点で任意の非決定論的な動作のリスクを冒すのではなく、迅速かつ完全に失敗します。

イテレータのフェイルファスト動作は、一般的に言えば、非同期の同時変更が存在する場合にハードな保証を行うことができないため、保証できないことに注意してください。フェイルファーストイテレータは、ベストエフォートベースでConcurrentModificationExceptionをスローします。したがって、この例外に正確性を依存するプログラムを作成するのは誤りです。反復子のフェイルファスト動作は、バグを検出するためにのみ使用する必要があります。

このクラスは、Java Collections Frameworkのメンバーです。

76
Gant

Java.util.HashSet?ルックアップにcontains()を使用します。

14
Lawrence Dol

静的メソッドも参照してくださいCollections#newSetFromMap指定されたマップ実装に基づいてセットを作成します。これは、例えば弱いハッシュセットを作成するのに便利です。

2
akuhn

Java Setは重複を削除するように設計されており、キーが重複を含むことは決してないため、HashMapはキーを管理するために内部的にJava Setを使用する必要があります。あなたの要件。

0
Ashok Koyi