JavaでのHashMapとHashtableの違い

著者: Laura McKinney
作成日: 2 4月 2021
更新日: 26 4月 2024
Anonim
14.11 HashMap and HashTable in Java
ビデオ: 14.11 HashMap and HashTable in Java

コンテンツ


HashMapとHashtableは両方とも、 オブジェクトのグループ で表されている ペア。各 ペアが呼び出されます エントリ オブジェクト。の コレクション エントリのHashMapおよびHashtableのオブジェクトによって参照されます。コレクション内のキーは一意である必要があります。 HashMapとHashtableの違いは ハッシュマップ 特にMapインターフェースを実装していますが、 ハッシュ表 Mapインターフェイスを実装するために再設計されたDictionaryクラス(レガシークラス)を拡張します。他の重要な違いは、HashMapのオブジェクトが 非同期 一方、Hashtableのオブジェクトは 同期された.

以下に示す比較チャートを見て、HashMapとHashtableの違いをさらに見てみましょう。

  1. 比較表
  2. 定義
  3. 主な違い
  4. 類似点
  5. 結論

比較表

比較の根拠ハッシュマップハッシュ表
実装/拡張HashMapクラスはMapインターフェースを実装し、AbstractMapクラスを拡張します。HashtableはDictionary Legacyクラスを拡張しますが、再設計され、Mapインターフェイスも実装するようになりました。
同期HashMapは非同期であるため、HashMapオブジェクトはスレッドセーフではありません。Hashtableは同期されているため、Hashtableのオブジェクトはスレッドセーフです。
キー/値キーは一度だけNullを返すことができますが、値は何回でもNullを返すことができます。キーは、ハッシュテーブルのインデックスとして使用されるハッシュコードを取得するために使用されるため、Nullを返すことはできません。また、値はNullを返すこともできません。
デフォルトの初期容量HashMapのデフォルトの初期容量は16です。Hashtableのデフォルトの初期容量は11です。
横断HashMapはIteratorによって走査されます。Mapクラスと同様に、Hashtableも走査用のIteratorを直接サポートしていないため、Enumeratorを使用します。


HashMapの定義

HashMapは、を実装するクラスです 地図 インターフェースと拡張 AbstractMap クラスはハッシュテーブルを使用します。 HashMapのオブジェクトは、コレクション/セットを参照します 各キーが特定の値にマッピングされるペア。コレクション内のキーは、値を取得するために使用されるため、一意である必要があります。一方、コレクション内の値は複製できます。 HashMapクラスの宣言とHashMapclassのコンストラクターは次のとおりです。

/ * Kはキーを表し、Vは値を表します* / class HashMap / * HashMapクラスのコンストラクタ* / HashMap()HashMap(Map <?extends K、?extends V> m)HashMap(int capacity)HashMap(int capacity、float fillRatio)

最初のコンストラクターは、HashMapの空のオブジェクトを初期化するデフォルトのコンストラクターであり、デフォルトの容量は16、デフォルトの充填率は0.75です。 2番目のコンストラクターは、mの値でハッシュマップを初期化します。 3番目のコンストラクターは、引数 "capacity"で指定された値に対応する初期容量を持つハッシュマップを作成します。 4番目のコンストラクターは、パラメーターで指定された容量と充足率でハッシュマップを初期化します。ハッシュマップのエントリをフィードする方法を学びましょう。

ハッシュマップhm = new Hashmap(); hm.put( "Ajay"、275); hm.put( "Vijay"、250); hm.put( "Jonny"、150); hm.put( "Jordan"、200); System.out.ln(hm); / * output * / {Vijay = 250、Jonny = 150、Ajay = 275、Jordan = 200}

上記のコードでは、空のHashMapオブジェクトを作成したことがわかります。 hm デフォルトの初期容量とデフォルトの充填率で。次に、キーを値にマップするput(K、V)メソッドを使用して、ハッシュマップに4つのエントリを挿入しました。挿入順序が固定されていないため、入力した順序でエントリが編集されないことがわかります。今、あなたがすでにエントリを持っている場合を考えてみましょう ハッシュマップで、その後put(K1、V5)を挿入しようとします。つまり、同じキーを異なる値にマップしようとします。次に、putメソッドは古い値V1を新しい値V2に置き換え、古い値V1を返します。それ以外の場合、キーの値を置き換えようとしない場合、putメソッドはそのキーに対してNullを返します。

ハッシュテーブルの定義

ハッシュテーブルは、 辞書 レガシークラスであり、実装するために再設計されたクラス 地図 インタフェース。 Hashtableは、データ構造としてハッシュテーブルを使用します。 HashtableはHashMapに似ていますが、ここでもHashtableのオブジェクトは各エントリが次のペアであるエントリのコレクションを参照します 。一方、コレクション内のすべてのキーは一意である必要があり、値は複製できます。キーは、インデックスを決定するハッシュコード値を取得するために特に使用されます。 ペアはハッシュテーブルに保存されます。ハッシュテーブルでは、キーも値もNULLポインターを返すことはできません。 Hashtableクラスの宣言とhashtableクラスのコンストラクターを見てみましょう。

/ * Kはキーを指定し、Vはキーに関連付けられた値を指定します* / class Hashtable / * Hashtableのコンストラクタ* / Hashtable()Hashtable(int size)Hashtable(int size、float fillRatio)Hashtable(Map <?extends K、?extends V> m)

上記のコードでは、最初のコンストラクターはクラスHashtableの空のオブジェクトを作成するデフォルトコンストラクターであり、デフォルトのサイズは11、デフォルトの充填率は0.75です。 2番目のコンストラクターは、パラメーター「size」で指定された値に対応するサイズのハッシュテーブルを作成します。 3番目のコンストラクターは、パラメーターで指定されたサイズと塗りつぶし率でハッシュテーブルを作成します。 4番目のコンストラクターは、値mでハッシュテーブルを初期化します。挿入方法を学びましょう ハッシュテーブルのペア。

Hashtable ht = new Hashtable(); ht.put(new hashCode(2)、275); ht.put(new hashCode(12)、250); ht.put(new hashCode(16)、150); ht.put(new hashCode(8)、200); System.out.ln(ht); / * output * / {12 = 250、16 = 150、2y = 275、8 = 200}

上記のコードでは、Hashtableの空のオブジェクトを作成し、put()メソッドを使用して4つのエントリを挿入しました。 putメソッド内で、hashCode()を呼び出しました。これは、エントリオブジェクトのインデックス値として機能するハッシュコード値を計算して返します。ご覧のとおり、ハッシュテーブルのサイズについては言及しなかったため、デフォルトでは11になります。ここでも、挿入順序は保持されないため、edエントリが順番に表示されない場合はフィードされました。


  1. HashMapは実装します 地図 インターフェイスし、抽象クラスを拡張します。 AbstractMap 一方、Hashtableは抽象クラスを拡張します 辞書、これもレガシークラスであり、後で実装するためにリエンジニアリングされました 地図 インタフェース。
  2. HashMapオブジェクトは 非同期 つまり、複数のスレッドが同時に操作できるため、スレッドセーフではありません。一方、Hashtableのオブジェクトは 同期された つまり、スレッドがHashtableのオブジェクトを操作する場合、他のスレッドがそのオブジェクトにアクセスできないように、そのオブジェクトのロックを取得する必要があるため、スレッドセーフです。
  3. HashMapではキーを返すことができます 一度だけヌル、および値は返すことができます 複数回ヌル。一方、キーは、ハッシュコード値を取得するために使用されるため、Nullを返すことはできません。 ペアも値もNullを返すことができます。
  4. HashMapクラスのハッシュテーブルのデフォルトの容量は 16 一方、Hashtableのハッシュテーブルのデフォルトの容量は 11.
  5. イテレータ ハッシュマップエントリをトラバースできます。一方、ハッシュテーブルはイテレータを直接サポートしていないため、一般的に 列挙子 Hashtableのエントリを走査するために使用されます。

類似点:

  • HashMapとHashtableは両方とも、 ハッシュ表.
  • HashMapとHashtableは両方とも実装しています 地図 インタフェース
  • 挿入順序は保持されません HashMapとHashtableの両方で、キーを使用して取得したハッシュコードに基づきます。
  • HashMapおよびHashtableでは、キーは ユニークな 一方、値は 複製された.
  • HashMapとHashtableは両方とも含むことができます 異種オブジェクト キーと値の両方に対して。
  • HashMapとHashtable、両方とも実装 シリアライズ可能 そして クローン可能 インターフェイスが ではなく、ランダムアクセス.
  • HashMapとHashtableの両方にデフォルトの充填率があります 0.75.
  • HashMapとHashtableは両方とも検索または 探している オペレーション。

結論:

HashMapは、オブジェクトが同期されておらず、複数のスレッドが同時に操作できるため、パフォーマンスが向上し、Hashtableよりも高速です。