Warum HashMap nicht garantiert, dass die Reihenfolge der Map im Zeitverlauf konstant bleibt

8

Ich habe hier über den Unterschied zwischen Hashmap und Hashtable gelesen: Ссылка

Kann jemand etwas Licht darauf werfen, warum es folgendes sagt?

"5. HashMap garantiert nicht, dass die Reihenfolge der Karten im Zeitverlauf konstant bleibt."

Könnte sich die Reihenfolge während des erneuten Hash-Vorgangs ändern, weshalb?

Es wäre auch schön, wenn Sie mich auf eine Ressource oder eine Liste von Sammlungen verweisen könnten, die ein solches Verhalten aufweisen, dass sie nicht garantieren, dass die Reihenfolge konstant bleibt.

AFIK, ArrayList gibt eine solche Garantie (lassen Sie mich wissen, wenn ich falsch liege)

EDIT: 'Reihenfolge der Karte' = vielleicht Reihenfolge, in der Schlüssel oder Werte eingegeben werden.

    
Watt 04.02.2013, 13:05
quelle

4 Antworten

9

Eine HashMap hat keine Bestellung - zu jeder Zeit. Es wird eigentlich nicht für diesen Zweck verwendet. Die Reihenfolge kann sich ändern, auch wenn sie nicht erneut angezeigt wird.

Wenn die Reihenfolge konstant bleiben soll, verwenden Sie eine LinkedHashMap

    
Jean Logeart 04.02.2013, 13:09
quelle
4

Der Sinn einer Hashing-Strategie besteht darin, Objekte auf eine pseudozufällige Weise zu platzieren. Es tut dies so, dass die meiste Zeit nur ein Schlüssel / Element zu einem gegebenen Bucket gehackt wird. Dies ermöglicht eine O (1) Lookup-Zeit. Wenn eine HashMap oder Hashtable wächst, ändert sich die Anzahl der Buckets, und die Schlüssel / Elemente werden in einer anderen Pseudozufallsart platziert.

Die einfachste Lösung hierfür ist die Verwendung von LinkedHashMap. Dies wird die Reihenfolge der Hinzufügung oder optional die Reihenfolge des letzten Zugriffs beibehalten. Ich bevorzuge es, diese Sammlung zu verwenden, weil sie das Debuggen erleichtert, da ich vorhersagen kann, wo ein Objekt wahrscheinlich ist, und manchmal kann die Reihenfolge, in der ein Objekt hinzugefügt wurde, nützliche Informationen sein.

BTW Wenn Sie interessiert sind, wie viele Bestellungen eine kleine Anzahl von Schlüsseln haben kann Reihenfolge der Elemente in einer Hash-Sammlung

    
Peter Lawrey 04.02.2013 13:22
quelle
3

Für mich der folgende Code:

%Vor%

Ausgänge:

%Vor%     
Mikhail Vladimirov 04.02.2013 13:15
quelle
1

Eine HashMap enthält eine Anzahl von Buckets (die als Array implementiert sind), in denen Einträge gespeichert werden.

Wenn ein Element zur Map hinzugefügt wird, wird es Buckets basierend auf einem Wert zugeordnet, der aus seinem hashCode und der Bucket-Größe der HashMap abgeleitet wird. (Beachten Sie, dass der Bucket möglicherweise bereits belegt ist, was als Kollision bezeichnet wird. Dies wird ordnungsgemäß und korrekt gehandhabt, aber ich ignoriere diese Behandlung für die Beschreibung, da das Konzept dadurch nicht geändert wird.)

Warum HashMap nicht garantiert, dass die Reihenfolge der Karte im Laufe der Zeit konstant bleibt

    
Achintya Jha 04.02.2013 13:09
quelle

Tags und Links

yii\base\ErrorException
Copied! Copy Stacktrace Search Stackoverflow Search Google Error

PHP Core Warningyii\base\ErrorException

PHP Startup: Unable to load dynamic library 'mongodb.so' (tried: /usr/lib64/php/modules/mongodb.so (/usr/lib64/php/modules/mongodb.so: cannot open shared object file: No such file or directory), /usr/lib64/php/modules/mongodb.so.so (/usr/lib64/php/modules/mongodb.so.so: cannot open shared object file: No such file or directory))

$_GET = [
    'id' => '347144',
    'url' => 'why-hashmap-does-not-guarantee-that-the-order-of-the-map-will-remain-constant-ov',
];

$_COOKIE = [
    '_csrf-frontend' => 'a1d5a57cf7d14c57c87cfaedd59cc1ab4cbfd5e925799eb543b4d2d6c0718c1ba:2:{i:0;s:14:"_csrf-frontend";i:1;s:32:"-Z3YRlh2i_3OQdLOp1FsNJT51DdzN6PT";}',
    'advanced-frontend' => '213e3df290d89d169d93b18e89b5e46e',
];

$_SESSION = [
    '__flash' => [],
];