9

ここでHashmapとHashtableの違いについて読んでいました:http: //javarevisited.blogspot.sg/2010/10/difference-between-hashmap-and.html

誰かがそれが次のように言う理由に光を当てることができますか?

「5.HashMapは、マップの順序が時間の経過とともに一定に保たれることを保証するものではありません。」

再ハッシュ中に順序が変わる可能性がありますか?それが理由ですか?

また、順序が一定であることを保証しないような動作を示すリソースまたはコレクションのリストを教えていただければ幸いです。

AFIK、ArrayListはそのような保証を与えます(私が間違っているかどうか教えてください)

編集:'マップの順序'=キーまたは値が入力される順序かもしれません。

4

4 に答える 4

13

HashMapには順序がありません - いつでも。実際にはその目的には使用されません。再ハッシュしなくても順序変わる場合があります。

順序を一定に保つ必要がある場合は、 LinkedHashMapを使用します

于 2013-02-04T13:09:17.797 に答える
5

ハッシュ戦略のポイントは、疑似ランダムな方法でオブジェクトを配置することです。これにより、ほとんどの場合、1 つのキー/要素のみが特定のバケットにハッシュされます。これにより、O(1) ルックアップ時間が可能になります。HashMap または Hashtable が大きくなると、バケットの数が変化し、キー/要素が別の擬似ランダムな方法で配置されます。

これに対する最も簡単な解決策は、LinkedHashMap を使用することです。これにより、追加の順序またはオプションで最後のアクセスの順序が維持されます。オブジェクトがどこにある可能性が高いかを予測でき、オブジェクトが追加された順序が有用な情報になる場合があるため、デバッグが容易になるため、私はこのコレクションを使用することを好みます。

ところで、少数のキーが持つことができる順序の数に興味がある場合は、ハッシュコレクション内の要素の順序

于 2013-02-04T13:22:08.140 に答える
4

私にとっては、次のコード:

Map <Integer, Object> map = new HashMap <Integer, Object> (4);

map.put (60, null);
map.put (48, null);
map.put (29, null);

System.out.println (map);

map.put (47, null);
map.put (15, null);
map.put (53, null);

map.remove (47);
map.remove (15);
map.remove (53);

System.out.println (map);

出力:

{29=null, 48=null, 60=null}
{48=null, 29=null, 60=null}

初期容量(ここでは4)を超えた際に発生する再ハッシュのため、順番が変わりました。追加のエントリが再び削除されても、元の順序は復元されません。

于 2013-02-04T13:15:32.547 に答える
1

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

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

HashMap がマップの順序が時間の経過とともに一定であることを保証しない理由

于 2013-02-04T13:09:22.617 に答える