web-dev-qa-db-ja.com

HashMapまたはHashTableでJavaアイテムを注文する方法は?

Java MapHashMapまたはHashtable)のアイテムを追加するときにそれらを注文する方法を考えていました。キーはハッシュコード、メモリ参照、または割り当て優先順位...?

Mapの同じペアが常に同じ順序であるとは限らないことに気付いたからです

60
Eyad Salah

Java.util.HashMap は順不同です。それ以上のことを想定することはできません。

このクラスは、マップの順序を保証しません。特に、順序が一定であることを保証するものではありません。

Java.util.LinkedHashMap は挿入順序を使用します。

この実装は、そのすべてのエントリを介して実行される二重リンクリストを維持するという点でHashMapと異なります。このリンクリストは、通常、キーがマップに挿入された順序(挿入順序)である反復順序を定義します。

Java.util.TreeMapSortedMap は、キーの自然な順序またはカスタムの順序を使用します。

マップは、そのキーの自然な順序に従って、または使用されるコンストラクターに応じて、マップ作成時に提供されるComparatorに従ってソートされます。

121

まず第一に:HashMap特にdoes n'tは安定した、または定義された順序を提供します。したがって、あなたが観察するものは単に実装の詳細であり、あなたはする必要はありません何らかの形でそれに依存しています。

一見ランダムな順序の理由を知ることが役立つ場合があるため、基本的な考え方は次のとおりです。

HashMapには、エントリを格納するバケットの数(配列として実装)があります。

アイテムがマップに追加されると、hashCodeHashMapのバケットサイズから導出された値に基づいて、バケットに割り当てられます。 (バケツがすでに占有されている可能性があることに注意してください。これは衝突と呼ばれます。これは正常かつ正確に処理されますが、概念を変更しないため、説明の処理は無視します)。

全体の知覚される順序(Mapを反復することによって返されるような)は、それらのバケット内のエントリの順序に依存します。

サイズが再ハッシュされると(マップが満杯のしきい値を超えたため)、バケットの数も変わります。これは、バケットの数もバケットの数から導出されるため、各要素の位置が変わる可能性があることを意味します。

17
Joachim Sauer

HashMapはまったくソートしません。キー値でソートするマップでは、代わりにTreeMapを使用する必要があります。

TreeMapのJavaDocsから:

SortedMapインターフェースの赤黒ツリーベースの実装。このクラスは、使用されるコンストラクターに応じて、キーのクラスの自然順序(Comparableを参照)、または作成時に提供されるコンパレーターによってソートされたマップがキーの昇順になることを保証します。

HashMapのドキュメントから:

このクラスは、マップの順序を保証しません。特に、順序が一定であることを保証するものではありません。

5
Behrang

Mapは順序付けられたデータ構造ではありません-HashMapのエントリが特定の順序にある​​ことに依存しないでください。 MapLinkedHashMapなどの一部のTreeMap実装は特定の順序を保証しますが、HashMapは保証しません。

内部で何が起こっているのかを本当に知りたい場合は、HashMapのソースコードを検索してください。JDKインストールディレクトリにあるsrc.Zipで見つけることができます。

HashMapには、エントリを格納する「バケット」がいくつかあります。エントリが格納されるバケットは、エントリのキーのハッシュコードによって決まります。 HashMapにエントリが表示される順序は、キーのハッシュコードによって異なります。ただし、エントリがHashMap内の特定の順序にある​​ことに依存するプログラムを作成しないでください。実装はJavaの将来のバージョンで変更される可能性があり、プログラムは動作しません。もう。

1
Jesper

ハッシュマップには定義されていない要素の順序があります

1
Robar

ハッシュテーブルには定義された順序はありません。キーはハッシュコードに基づいてスロットに配置されますが、それでも簡単なハッシュコードの順序ではありません。

0
Marcelo Cantos

HashMapは、キーの一部を使用して生成された一意のハッシュ値を使用して値を保存します。このハッシュ値は、保存されるアドレスにマッピングされます。これにより、アクセスO(1)が保証されます。

一方、LinkedHashmapは、マップに追加した順序を保持します。

0
Vaishak Suresh