web-dev-qa-db-ja.com

JavaのHashSetはどのように機能しますか?

可能性のある複製:
Javaハッシュマップはどのように機能しますか?

JavaのHashSetがどのように機能するか、なぜArrayListsを使用するよりも高速であるかを誰かに説明してもらえますか?

17
madCode

まず、HashSetとは異なり、ArrayListSet とは異なり、重複を含めることはできませんが、ArrayListは可能です-異なる目的のために作成されます。また、リストとは異なり、順序付けは保証されません。

次に、HashSetハッシュテーブル データ構造に構築され、要素のO(1)シーク時間を許可します。

多くの場合、HashSet遅いであり、次にArrayList-iterateたとえば要素-たとえば、通常ArrayListで実行すると、HashSetよりも高速になります[ハッシュのキャッシュパフォーマンスが悪いため、その他の理由で]

14
amit

HashSetは実際にはHashMapであり、値は常に同じです。

HashMapの動作方法は、多くの場所で説明されています(「ハッシュテーブル」とも呼ばれます)。つまり、キー(オブジェクト)のハッシュを生成し、それらをテーブルに配置します。その後、キーを探すたびに、そのハッシュが計算され、テーブル内のバケットが直接参照されます。これは、マップにアクセスするための操作が1つ(ベストケース)しかないことを意味します。

HashSetにはキーが含まれるだけなので、.contains(..)O(1)になります。それとremove(..)は、HashSetArrayList(O(n))よりも高速な唯一の演算です。反復は同じですが、加算も同じです。

19
Bozho

これらは2つの異なるデータ構造です。

HashSetの背後にある概念は、重要な調査です。
つまり入力キーの変換を使用して、配列内の値の場所のインデックスを取得します。
配列はランダムアクセスを許可するため、これは定数O(1)操作です。

Arraylistも配列によってサポートされているため、アクセスのためのO(1)操作です。ただし、ランダムアクセスと挿入のみ。

searchは、配列リストのO(N)操作ですが、HashSetとは異なり、リストのすべての要素を検索して値を取得する必要があるため、キーを変換して配列にアクセスします。 HashSetでの検索はO(1)です

1
Cratylus

実際のところ、たとえばArrayListに対してiterating overおよびappendingの方が高速です。

そして、一体、あなたはsort a HashSetさえできません。

しかし、最も速いのはNoOpです。 NoOpほど高速なものはありません。確かに、それはNoOpにはあまり効果がありません。しかし、それはそれで本当に速いです!

「よりも速い」と考えるものをより正確にする必要があります。