HashSetとHashMapの違いは?


168

別に事実からHashSet重複する値を許可しない、の違いは何であるHashMapとはHashSet

私は賢明な実装を意味しますか?どちらもハッシュテーブルを使用して値を格納するため、少しあいまいです。


HashSetはHashMapを使用して実装されます
therealprashant '19年

:HashSetのは、あなたの上記の質問への答えを理解するのに役立ちますArrayListのとは異なっている理由を私は知っていると思う stackoverflow.com/questions/18706870/...
djangofan

回答:


150

それらは完全に異なる構成です。A HashMapはの実装ですMap。A 地図はキーを値にマップします。キーの検索はハッシュを使用して行われます。

一方、a HashSetはの実装ですSet。A セットは、セットの数学的モデルに一致するように設計されています。あなたが指摘HashSetしたように、A はHashMapその実装をバックアップするためにを使用します。ただし、完全に異なるインターフェースを実装しています。

Collection目的に最適なものを探している場合、このチュートリアルは出発点として最適です。あなたが本当に何が起こっているのか知りたいのなら、そのための本もあります。


そのステートメントは少し単純化しています。「 "」は指定されたオブジェクトのハッシュ値を返します。オブジェクト自身のhashCodeに加えて、このメソッドは「補足ハッシュ関数」を適用し、貧しい人々を防御します品質のハッシュ関数を防ぎます。HashMapのは、電源の2つの長さのハッシュテーブルを使用していますので、これは非常に重要です「。weblogs.java.net/blog/2005/06/18/hashmap-implementation -あなたはドキュメントを見ればしかし、あなたはこのハッシュは物事を配信していることがわかります「バケット」を超えているので、最終的には2つのものが同じバケットにマッピングされると
思い

1
2番目の質問に答える-いいえ。マップは、@ Bruno Rothgiesserの優れた回答で定義されている(キー->値)が必要な場合です。セットは重複しない要素用です。key-> valueではなく重複が必要な場合は、java.util.List実装をチェックアウトします。決定的なガイドについては、コレクションのチュートリアルを確認してください:java.sun.com/docs/books/tutorial/collections/index.html
justkt

@justk:はい、1つのバケットで2つのキーを取得でき、equals()を使用してそれらを区別します。そのため、hashCode()とequals()に互換性があることが不可欠です。
Michael Borgwardt、

6
@SpikETidE:HashMapもHashSetも重複を許可しません。それがポイントです。
Michael Borgwardt、

23
@SpikETidE:セットにはキーと値のペアがなく、要素のみがあります。そして、HashSetは、セット要素をキーとして持つHas​​hMapを持ち、値は無視されることで実装されます。
Michael Borgwardt、

300

HashSetはセットです。例:{1,2,3,4,5}

HashMapは、キー->値(キーから値)のマップです。例:{a-> 1、b-> 2、c-> 2、d-> 1}

上記の例では、HashMapに重複したキーがあってはならないが、重複した値がある場合があることに注意してください。

HashSetでは、重複する要素があってはなりません。


しかし、混乱の(最も興味深い)理由は、HashSetでも要素にアクセスするための「キー」が必要なためです。つまり、オブジェクトは、たとえ数学であっても、アクセスまたは参照される場合、名前(またはアドレス)を持っています。したがって、この本当の意味でのHashSetは、その要素の名前(またはアドレス)をキーにした、特に単純なHashMapです。
アンドリューマーシャル

65

ハッシュセット

  1. HashSetクラスはSetインターフェースを実装します
  2. HashSetでは、オブジェクト(要素または値)を格納します。たとえば、文字列要素のHashSetがある場合、それはHashSet要素のセットを表すことができます:{“ Hello”、“ Hi”、“ Bye”、“ Run”}
  3. HashSetは重複要素を許可しません。つまり、HashSetに重複した値を格納することはできません。
  4. HashSetは単一のnull値を持つことを許可します。
  5. HashSetは同期されません。つまり、明示的に同期されない限り、スレッドセーフな操作には適していません。[類似性]

                          add      contains next     notes
    HashSet               O(1)     O(1)     O(h/n)   h is the table 

HashMap

  1. HashMapクラスはMapインターフェースを実装します
  2. HashMapは、キーと値のペアを格納するために使用されます。つまり、キーと値のマッピングを維持します(HashMapクラスは、非同期でnullを許可することを除いて、Hashtableとほぼ同じです。)これは、整数キーと文字列型の値がある場合にHashMap要素を表す方法です。例:{1->” Hello”、2->” Hi”、3->” Bye”、4->” Run”}
  3. HashMapは重複したキーを許可しませんが、重複した値を許可します。
  4. HashMapは単一のnullキーと任意の数のnull値を許可します。
  5. HashMapは同期されません。つまり、明示的に同期されない限り、スレッドセーフな操作には適していません。[類似性]

                           get      containsKey next     Notes
     HashMap               O(1)     O(1)        O(h/n)   h is the table 

詳細については、この記事を参照しください。


36

どちらの名前もHashで始まるのは本当に残念です。それは彼らの中で最も重要ではない部分です。他の人が指摘したように、重要な部分はハッシュの後に来ます- セットマップ。それらはそれぞれ、セット -順序付けられていないコレクション-およびマップです -キー付きアクセス権を持つコレクションが。彼らはたまたまハッシュで実装されています-それは名前が由来するところです-しかしそれらの本質は名前のその部分の後ろに隠されています。

それらの名前で混乱しないでください。彼らは深く異なるものです。


@HiteshSahuどちらもハッシュテーブルで実装されています(en.wikipedia.org/wiki/Hash_table)。これは、セットを表すための適切なデータ構造であり、適切な方法で効率的です。基本的に、HashMapのキーはHashSetとして実装されます。したがって、それらに名前を付けた人は誰でも、それらを実装するためにいくつかの問題に取り組み、(推測では)目的ではなく実装に集中しました。
Carl Manaster、2017

1
よく説明しました。ありがとうございました。
user3932000 2018

5

Hashset内部の実装HashMap。内部実装を確認すると、HashSetに挿入された値はHashMapにキーとして格納され、値はObjectクラスのダミーオブジェクトです。
HashMapとHashSetの違いは次のとおりです。

  1. HashMap キーと値のペアが含まれ、getメソッドがないためHashSetを毎回繰り返す必要があるため、各値にはキーでアクセスできます。
  2. HashMap Mapインターフェースを実装し、1つのnull値をキーとして、複数のnull値を値として許可します。 HashSetインターフェース実装する場合、1つのnull値のみを許可し、重複する値は許可しません(HashMapキーでは1つのnullキーを許可し、HashSetでは1つのnull値を許可します) HashSetはHashMapを内部的に実装しているため)。
  3. HashSetまたHashMap、反復中は挿入の順序は維持されません。

3

HashSetを使用すると、オブジェクトをセットに格納できます。HashMapを使用すると、キーと値に基づいてオブジェクトを格納できます。すべてのオブジェクトまたは格納されたオブジェクトにはキーがあります。


2

名前が示すように、HashMap は連想マップ(キーから値へのマッピング)であり、HashSetは単なるSetです。


2
@SpikETidEこれは一意性の実装方法の詳細ですが、HashSetの意味はセットを実装することです。
Michael Borgwardt、

1
つまり、「重複が不要な場合はhashSetを使用します...重複が気にならない場合はHashMapを使用してください」ということになります。
SpikETidE

3
Javaは「要素が重複する可能性のあるコレクション」(「バッグ」)の特定のクラスを実装していません。これにはリストを使用できます(リストはバッグに意味を追加しますが、これは無視できます)。
leonbloy

2

JavaでのHashSetとHashMapの違い

1) HashMapとHashSetの最初の最も重要な違いは、HashMapがMapインターフェースの実装であるのに対し、HashSetはSetインターフェースの実装です。つまり、HashMapはキー値ベースのデータ構造であり、HashSetは重複を許可しないことで一意性を保証します。現実HashSetはJavaのHashMapのラッパーです。HashSet.javaのadd(E e)メソッドのコードを見ると、次のコードが表示されます。

public boolean add(E e) 
{
    return map.put(e, PRESENT)==null;
}

ここで、オブジェクトをキーと値としてマップに配置すると、ダミーの最終オブジェクトPRESENTになります。

2) HashMapとHashSetの2番目の違いは、add()メソッドを使用して要素をSetに配置するが、JavaのHashMapにキーと値を挿入するためにput()メソッドを使用することです。

3) HashSetでは1つのnullキーしか許可されませんが、HashMapでは1つのnullキー+複数のnull値を許可できます。

JavaのHashSetとHashMapの違いは以上です。要約すると、HashSetとHashMapは2つの異なるタイプのコレクションで、1つはセットで、もう1つはマップです。


2

JavaでのHashSetとHashMapの違い

HashSetは内部的にHashMapを使用してオブジェクトを格納します。add(String)メソッドが呼び出されると、HahsMap put(key、value)メソッドが呼び出されます。ここで、key = Stringオブジェクト&value = new Object(Dummy)。オブジェクト。

Hashset / HashMapにキーとして格納されているオブジェクトは、ハッシュコードと等しいコントラクトをオーバーライドする必要があります。

HashMapで値オブジェクトにアクセス/格納するために使用されるキーは、Finalとして宣言する必要があります。変更されると、Valueオブジェクトが見つからず、nullを返すためです。


1

A HashMapは、任意のタイプのカスタムキーによってインデックス付けされたオブジェクトを追加、取得、削除、...することです。
A HashSetは、要素を追加、削除し、ハッシュを比較して要素が存在するかどうかを確認します。

したがって、HashMapには要素が含まれており、HashSetはそれらのハッシュを記憶しています。


1
それらのハッシュを比較し、equals()メソッドを呼び出す。
ローン侯爵

1

違い:階層に関して:HashSetはSetを実装します。HashMapはMapを実装し、キーと値のマッピングを格納します。

データベースに関してHashSetとHashMapを使用すると、それぞれの重要性を理解するのに役立ちます。
HashSet:通常、一意のコレクションオブジェクトを格納するために使用されます。例:
クラスItemとClass Bidの 間の多対1の関係シップを格納するための実装クラスとして使用される場合があります(Itemには多数の入札があります)HashMap:キーを値にマップするために使用されます。値はnullまたは任意のオブジェクトです。 /オブジェクトのリスト(それ自体がオブジェクトです)。



0

HashSetはHashMapを内部的に使用して、そのエントリを格納します。内部HashMapの各エントリは単一のオブジェクトによってキーが付けられるため、すべてのエントリは同じバケットにハッシュされます。内部HashMapがその値を格納するために何を使用していたかは思い出しませんが、その内部コンテナーには重複した値が含まれることはないため、実際には問題になりません。

編集:マシューのコメントに対処するために、彼は正しいです。私はそれを逆にした。内部HashMapには、Set要素を構成するオブジェクトがキーとして設定されています。HashMapの値は、HashMapバケットに単に格納されるオブジェクトです。


そうではありません。セット要素は、HashMapキーとして直接使用されます。
Matthew Flaschen、

0

HashMapMap、実装できるように重複した値が、重複しないキーを。。オブジェクトを追加するには、キーと値のペアが必要です。NullキーとNull値が許可されます。例えば:

{The-> 3、world-> 5、is-> 2、nice-> 4}

HashSetは、重複を許可Setない実装です。重複するオブジェクト、public boolean add(Object o)メソッドの呼び出しを追加しようとした場合、セットは変更されずにを返しますfalse。例えば:

[世界は、素敵です]


-1

あなたはほとんどあなた自身の質問に答えました-ハッシュセットは重複した値を許可しません。バッキングハッシュマップを使用してハッシュセットを作成するのは簡単です(そして、値が既に存在するかどうかを確認するだけです)。私は、さまざまなJava実装がそれを行うか、より効率的に行うためのカスタムコードを実装すると思います。


1
@oedo- java.util.HashSetそれはjava.util.HashMap
10

2
重複を許可しないことはそれらの間の違いではありません。
ローン侯爵

-1

基本的にHashMapではユーザーはキーと値の両方を提供する必要がありますが、HashSetでは値のみを提供し、キーはハッシュ関数を使用して値から自動的に導出されます。したがって、KeyとValueの両方を取得した後、HashSetをHashMapとして内部に格納できます。


キー HashSetの値です。
ローン侯爵

-1

HashSetとHashMapはどちらもストアペアです。違いは、HashMapではキーを指定できるのに対し、HashSetではキーがオブジェクトのハッシュコードから取得されることです。


それが本当だった場合、HashSetは同じhashCodeを持つ複数のオブジェクトを格納できず、実際に格納します。
ローン侯爵

-1

HashMaps1つのnullキーとnull値を許可します。同期されないため、効率が向上します。必要な場合は、これらを使用して同期させることができますCollections.SynchronizedMap()

Hashtables nullキーを許可せず、同期されます。


彼はHashtablesを頼まなかった。質問には答えません。
ローン侯爵

-2

HashMapはMapインターフェースの実装ですHashSetはSetインターフェースの実装です

HashMapキーと値のペアの形式でデータを格納しますHashSetオブジェクトのみを格納します

マップに要素を追加するためにPutメソッドが使用されますSet要素が追加されるために使用されるAddメソッドが使用されます

ハッシュマップでは、ハッシュコード値はキーオブジェクトを使用して計算されます。ここでメンバーオブジェクトは、2つのオブジェクトで同じになる可能性のあるハッシュコード値を計算するために使用されます。

一意のキーを使用してオブジェクトにアクセスするため、HashMapはハッシュセットよりも高速です。HashSetはHashmapよりも低速です。


1
それらは基本的に同じパフォーマンスを持ち、「一意のキーが使用されているため」は正しくありません。
ローンの侯爵
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.