web-dev-qa-db-ja.com

HashMapがHashSetよりも速いのはなぜですか?

HashMapHashSetよりも速い理由を読んだり調べたりしています。

私は次のステートメントを完全には理解していません:

  1. 値は一意のキーに関連付けられているため、HashMapHashSetよりも高速です。

  2. HashSetでは、メンバーオブジェクトを使用してハッシュコード値を計算します。ハッシュコード値は2つのオブジェクトで同じである可能性があるため、equals()メソッドを使用して等しいかどうかを確認します。 falseを返す場合は、2つのオブジェクトが異なることを意味します。 HashMapでは、ハッシュコード値はキーオブジェクトを使用して計算されます。

  3. HashMapハッシュコード値は、キーオブジェクトを使用して計算されます。ここでは、メンバーオブジェクトを使用してハッシュコードを計算します。ハッシュコードは2つのオブジェクトで同じである可能性があるため、equals()メソッドを使用して等しいかどうかを確認します。 falseを返す場合は、2つのオブジェクトが異なることを意味します。

私の質問を締めくくるには:

  1. HashMapHashSetは同じ方法でハッシュコードを計算すると思いました。なぜ違うのですか?

  2. HashSetHashMapがハッシュコードを異なる方法で計算する具体的な例を教えてください。

  3. 「キーオブジェクト」とは何か知っていますが、「メンバーオブジェクト」とはどういう意味ですか?

  4. HashMapHashSetと同じことを、より高速に実行できます。なぜHashSetが必要なのですか?例:

    HashMap <Object1, Boolean>= new HashMap<Object1, boolean>();
    map.put("obj1",true);  => exist
    map.get("obj1");  =>if null = not exist, else exist
    
15
runcode

パフォーマンス:

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を使用します。あなたのコードはよりクリーンで他の人にとってより理解しやすいものになります。

要素のデータを保存する必要がある場合は、マップを使用してください。

19
denis

これらの答えはどれも実際には説明していませんなぜ HashMapはHashSetよりも高速です。どちらもハッシュコードを計算する必要がありますが、HashMapのキーの性質について考えてください。通常は単純な文字列または数値です。そのハッシュコードの計算は、オブジェクト全体のデフォルトのハッシュコード計算よりもはるかに高速です。 HashMapのキーがHashSetに格納されているオブジェクトと同じである場合、パフォーマンスに実際の違いはありません。違いは、HashMapのキーがどのようなオブジェクトであるかという点にあります。

2
TwinFeats