Die Reihenfolge der Elemente in einer HashMap unterscheidet sich, wenn dasselbe Programm in JVM5 im Vergleich zu JVM6 ausgeführt wird

7

Ich habe eine Anwendung, die eine Sammlung von Objekten in Zeilen anzeigt, ein Objekt = eine Zeile. Die Objekte werden in einer HashMap gespeichert. Die Reihenfolge der Zeilen hat keinen Einfluss auf die Funktionalität der Anwendung (deshalb wurde eine HashMap anstelle einer sortierbaren Sammlung verwendet).

Ich habe jedoch festgestellt, dass die gleiche Anwendung anders läuft, wenn sie mit zwei verschiedenen Versionen der Java Virtual Machine ausgeführt wird. Die Anwendung wird mit JDK 5 kompiliert und kann ohne Laufzeitunterschiede mit Java 5 oder Java 6 ausgeführt werden.

Das Objekt überschreibt java.lang.Object#hashCode() und natürlich wurde darauf geachtet, den in der Java-API angegebenen Vertrag einzuhalten. Dies zeigt sich daran, dass sie bei jedem Lauf der Anwendung (in der gleichen Java-Laufzeitumgebung) immer in der gleichen Reihenfolge erscheinen.

Aus Gründen der Neugierde, warum wirkt sich die Wahl der Java-Laufzeit auf die Reihenfolge aus?

    
bguiz 10.12.2009, 09:47
quelle

3 Antworten

17

Die Implementierungsdetails von HashMap können und ändern sich. Höchstwahrscheinlich hat dieses Paket private Methode (das ist von JDK 1.6.0_16):

%Vor%

Als Referenz ist das Analog in JDK 1.5.0_06:

%Vor%     
Michael Borgwardt 10.12.2009, 09:54
quelle
10

Wahrscheinlich, weil eine Map nicht definiert ist, um eine bestimmte Iterationsreihenfolge zu haben; Die Reihenfolge, in der die Elemente zurückkommen, ist wahrscheinlich ein Artefakt ihrer internen Implementierung und muss nicht konsistent bleiben.

Wenn die Implementierung zwischen Java 5 und 6 aktualisiert wird (insbesondere aus Leistungsgründen), hat Sun keinen Vorteil oder eine Verpflichtung, sicherzustellen, dass die Iterationsreihenfolge zwischen beiden konsistent bleibt.

BEARBEITEN : Ich habe gerade einen interessanten Ausschnitt in einem der frühen Java 6 Releases gefunden (leider bin ich mir der genauen Version nicht sicher, aber es ist anscheinend HashMap 1.68 von Juni 2006):

%Vor%

So scheint es, dass Sun trotz meiner obigen Behauptungen tatsächlich die Konsistenz der Iterationsreihenfolge berücksichtigt hat - zu einem späteren Zeitpunkt wurde dieser Code vermutlich fallen gelassen und die neue Ordnung wurde endgültig.

    
Andrzej Doyle 10.12.2009 09:52
quelle
0

HashMap ist mit keiner bestimmten Bestellung verheiratet, aber LinkedHashMap Implementierung der Map sollte die Reihenfolge beibehalten.

    
Andrei Taranchenko 10.12.2009 15:03
quelle

Tags und Links