比較表
比較基準 | ハッシュマップ | LinkedHashMap |
---|---|---|
基本 | HashMapでの挿入順序は維持されません。 | 挿入順序はLinkedHashMapに保存されます。 |
データ構造 | HashMapはHashTableを使って地図を保存します。 | LinkedHashMapはHashTableとLinked Listを使って地図を保存します。 |
拡張/実装 | HashMapはAbstractMapを拡張し、Mapインターフェースを実装します。 | LinkedHashMapはHashmapを拡張します。 |
バージョン | HashMapはJDK 2.0で導入されました。 | LinkedHashMapはJDK 4.0で導入されました。 |
オーバーヘッド | 比較的少ないオーバーヘッド。 | マップエントリの順序を維持する必要があるため、比較的多くのオーバーヘッドが発生します。 |
HashMapの定義
HashMapはマップを作成するために使用されるクラスです。 Map Interfaceを実装しています。 また、 AbstractMapクラスを拡張して、ハッシュテーブルを使用してエントリをマップに格納できるようにします。 マップのエントリは、各キーが値に関連付けられているペアです。 エントリ内のキーは値を取得するために使用されるため、キーは一意である必要があります。 そのため、HashMapでは重複キーを使用できません。 しかし、マップの各エントリ内のキーは異なるタイプを持つことがあります。つまり、HashMapによって作成されたマップ内のキーは、異種の場合があります。 HashMapがマップを格納するために使用するデータ構造はハッシュテーブルです。
HashMapのエントリの挿入順序は保持されません。 HashMapを使用して作成されたマップへのエントリの挿入は、エントリ内のキーによって計算されたハッシュコードに基づいています。 誤ってHashMapに重複したキーを入力した場合は、そのキーの以前の値が提案された新しい値で置き換えられ、古い値が返されます。 重複キーが使用されず、置き換えも行われていない場合、キーは常にNullを返します。 次の例でハッシュマップにエントリを追加する方法を見てみましょう。
Hashmap hm = new Hashmap(); hm.put( "Ajay"、275); hm.put( "Vijay"、250); hm.put( "Jonny"、150); hm.put( "Jordan"、200); System.out.println(hm); / * output * / {Vijay = 250、Jonny = 150、Ajay = 275、Jordan = 200}
上記のコードのように、HashMapのオブジェクトを作成し、putsメソッドを使用してエントリを追加したところ、HashMapオブジェクトを印刷したときに、エントリが挿入された順序で印刷されないことがわかります。 したがって、HashMapのエントリの順序が戻るようなふりをすることはできません。 HashMapはMapインタフェースとAbstractMapクラスのすべてのメソッドを使用し、新しいメソッドを導入しません。 独自のコンストラクタがあります。 ハッシュマップのデフォルトの容量は16 、デフォルトの充填率は0.75です。
LinkedHashMapの定義
LinkedHashMapはマップを作成するためのクラスでもあります。 LinkedHashMapはHashMapクラスを拡張し、後でJDKバージョン4.0でHashMapに導入されました。 HashMapクラスの子クラスであるLinkedHashMapは、コンストラクタとメソッドを含むHashMapクラスとまったく同じです。 しかし、LinkedHashMapは、マップへのエントリの挿入順序を維持するという意味で異なります。 マップを格納するためにLinkedHashMapによって使用されるデータ構造は、 リンクリストとハッシュテーブルです。
HashMapによって継承されたメソッドに加えて、LinkedHashMapはremoveEldestEntry()という1つの新しいメソッドを導入します。 このメソッドは、マップ内の最も古いエントリを削除するために使用されます。 LinkedHashMapのデフォルトの容量は16で、デフォルトの充填率は0.75です。これもHashMapクラスに似ています。
JavaにおけるHashMapとLinkedHashMapの主な違い
- 最も重要な違いは、HashMapの挿入順序は保持されないのに対し、LinkedHashMapの挿入順序は保持されることです。
- マップの要素を格納するためにHashMapによって使用されるデータ構造はHashtableです。 一方、LinkedHashMapで使用されるデータ構造は、 Linked listとHashtableです。
- HashMapクラスはAbstractMapクラスを拡張し、 Mapインタフェースを実装します。 ただし、LinkedHashMapクラスはHashMapクラスの子クラスです。つまり、LinkedHashMapクラスはHashMapクラスを拡張します。
- HashMapクラスはJDK 2.0バージョンで導入されました。 LinkedHashMapクラスは、 JDK 4.0バージョンで後で導入されました。
- 比較的LinkedHashMapクラスは、マップに挿入された要素の順序を維持する必要があるため、HashMapよりもオーバーヘッドが大きくなります。
結論:
LinkedHashMapは、マップに挿入されている要素の順序が心配な場合にのみ使用する必要があります。