HashMap
がHashSet
よりも速い理由を読んだり調べたりしています。
私は次のステートメントを完全には理解していません:
値は一意のキーに関連付けられているため、HashMap
はHashSet
よりも高速です。
HashSet
では、メンバーオブジェクトを使用してハッシュコード値を計算します。ハッシュコード値は2つのオブジェクトで同じである可能性があるため、equals()
メソッドを使用して等しいかどうかを確認します。 false
を返す場合は、2つのオブジェクトが異なることを意味します。 HashMap
では、ハッシュコード値はキーオブジェクトを使用して計算されます。
HashMap
ハッシュコード値は、キーオブジェクトを使用して計算されます。ここでは、メンバーオブジェクトを使用してハッシュコードを計算します。ハッシュコードは2つのオブジェクトで同じである可能性があるため、equals()
メソッドを使用して等しいかどうかを確認します。 false
を返す場合は、2つのオブジェクトが異なることを意味します。
私の質問を締めくくるには:
HashMap
とHashSet
は同じ方法でハッシュコードを計算すると思いました。なぜ違うのですか?
HashSet
とHashMap
がハッシュコードを異なる方法で計算する具体的な例を教えてください。
「キーオブジェクト」とは何か知っていますが、「メンバーオブジェクト」とはどういう意味ですか?
HashMap
はHashSet
と同じことを、より高速に実行できます。なぜHashSet
が必要なのですか?例:
HashMap <Object1, Boolean>= new HashMap<Object1, boolean>();
map.put("obj1",true); => exist
map.get("obj1"); =>if null = not exist, else exist
パフォーマンス:
HashSetのソースコード(少なくともJDK 6、7、および8)を見ると、内部でHashMapを使用しているため、基本的にサンプルコードで行っていることを正確に実行します。
したがって、Setの実装が必要な場合は、HashSetを使用し、Mapが必要な場合はHashMapを使用します。 HashSetの代わりにHashMapを使用するコードは、HashSetを直接使用する場合とまったく同じパフォーマンスになります。
適切なコレクションの選択
マップ-キーを値にマップします(連想配列) http://en.wikipedia.org/wiki/Associative_array 。
セット-重複する要素を含まないコレクション- http://en.wikipedia.org/wiki/Set_(computer_science) 。
コレクションが必要なのがそこに要素が存在するかどうかを確認することだけである場合は、Setを使用します。あなたのコードはよりクリーンで他の人にとってより理解しやすいものになります。
要素のデータを保存する必要がある場合は、マップを使用してください。
これらの答えはどれも実際には説明していませんなぜ HashMapはHashSetよりも高速です。どちらもハッシュコードを計算する必要がありますが、HashMapのキーの性質について考えてください。通常は単純な文字列または数値です。そのハッシュコードの計算は、オブジェクト全体のデフォルトのハッシュコード計算よりもはるかに高速です。 HashMapのキーがHashSetに格納されているオブジェクトと同じである場合、パフォーマンスに実際の違いはありません。違いは、HashMapのキーがどのようなオブジェクトであるかという点にあります。