Java Map
(HashMap
またはHashtable
)のアイテムを追加するときにそれらを注文する方法を考えていました。キーはハッシュコード、メモリ参照、または割り当て優先順位...?
Map
の同じペアが常に同じ順序であるとは限らないことに気付いたからです
Java.util.HashMap
は順不同です。それ以上のことを想定することはできません。
このクラスは、マップの順序を保証しません。特に、順序が一定であることを保証するものではありません。
Java.util.LinkedHashMap
は挿入順序を使用します。
この実装は、そのすべてのエントリを介して実行される二重リンクリストを維持するという点で
HashMap
と異なります。このリンクリストは、通常、キーがマップに挿入された順序(挿入順序)である反復順序を定義します。
Java.util.TreeMap
、 SortedMap
は、キーの自然な順序またはカスタムの順序を使用します。
マップは、そのキーの自然な順序に従って、または使用されるコンストラクターに応じて、マップ作成時に提供される
Comparator
に従ってソートされます。
まず第一に:HashMap
特にdoes n'tは安定した、または定義された順序を提供します。したがって、あなたが観察するものは単に実装の詳細であり、あなたはする必要はありません何らかの形でそれに依存しています。
一見ランダムな順序の理由を知ることが役立つ場合があるため、基本的な考え方は次のとおりです。
HashMap
には、エントリを格納するバケットの数(配列として実装)があります。
アイテムがマップに追加されると、hashCode
とHashMap
のバケットサイズから導出された値に基づいて、バケットに割り当てられます。 (バケツがすでに占有されている可能性があることに注意してください。これは衝突と呼ばれます。これは正常かつ正確に処理されますが、概念を変更しないため、説明の処理は無視します)。
全体の知覚される順序(Map
を反復することによって返されるような)は、それらのバケット内のエントリの順序に依存します。
サイズが再ハッシュされると(マップが満杯のしきい値を超えたため)、バケットの数も変わります。これは、バケットの数もバケットの数から導出されるため、各要素の位置が変わる可能性があることを意味します。
HashMap
はまったくソートしません。キー値でソートするマップでは、代わりにTreeMap
を使用する必要があります。
TreeMap
のJavaDocsから:
SortedMapインターフェースの赤黒ツリーベースの実装。このクラスは、使用されるコンストラクターに応じて、キーのクラスの自然順序(Comparableを参照)、または作成時に提供されるコンパレーターによってソートされたマップがキーの昇順になることを保証します。
HashMap
のドキュメントから:
このクラスは、マップの順序を保証しません。特に、順序が一定であることを保証するものではありません。
Map
は順序付けられたデータ構造ではありません-HashMap
のエントリが特定の順序にあることに依存しないでください。 Map
やLinkedHashMap
などの一部のTreeMap
実装は特定の順序を保証しますが、HashMap
は保証しません。
内部で何が起こっているのかを本当に知りたい場合は、HashMap
のソースコードを検索してください。JDKインストールディレクトリにあるsrc.Zipで見つけることができます。
HashMap
には、エントリを格納する「バケット」がいくつかあります。エントリが格納されるバケットは、エントリのキーのハッシュコードによって決まります。 HashMap
にエントリが表示される順序は、キーのハッシュコードによって異なります。ただし、エントリがHashMap
内の特定の順序にあることに依存するプログラムを作成しないでください。実装はJavaの将来のバージョンで変更される可能性があり、プログラムは動作しません。もう。
ハッシュマップには定義されていない要素の順序があります
ハッシュテーブルには定義された順序はありません。キーはハッシュコードに基づいてスロットに配置されますが、それでも簡単なハッシュコードの順序ではありません。
HashMapは、キーの一部を使用して生成された一意のハッシュ値を使用して値を保存します。このハッシュ値は、保存されるアドレスにマッピングされます。これにより、アクセスO(1)が保証されます。
一方、LinkedHashmapは、マップに追加した順序を保持します。