2016-08-01 9 views
3

Ich habe von Java 7 auf Java 8 aktualisiert und habe Junit-Fehler an Stellen bemerkt, an denen die keySet() von HashMap verwendet wurde.Java 8 HashMap KeySet() Ausgabe anders als Java 7

Map<String, String> map = new HashMap<String, String>(); 
map.put("var1".toUpperCase(), "var"); 
map.put("var".toUpperCase(), "var1"); 
Set<String> varKeys = replacementMap.keySet(); 

In Java 7:

varKeys=[VAR,VAR1] 

In Java 8:

varKeys=[VAR1,VAR] 

Jede Hilfe zu diesem Thema?

+6

'Set' und' Map' sind definitionsgemäß voneinander unabhängige Sammlungen. Die Ausgabe ist in beiden Fällen korrekt. – Crozin

+1

Was ist der JUNIT-Testfall, den Sie geschrieben haben? Die Reihenfolge ist nicht garantiert in einer HashMap/Set, Sie können ein TreeSet versuchen, wenn die Reihenfolge garantiert werden muss. –

+1

'" var1 ".toUpperCase()' sollte 'VAR1' nicht' var1' sein –

Antwort

2

Set garantiert nicht die Reihenfolge der Elemente. Wenn Sie hashmap bestellt haben, können Sie

6

verwenden. Ich empfehle, stattdessen zu verwenden, wenn Sie die Reihenfolge der Anzeigen beibehalten möchten. Die HashMap ist nicht definiert und nicht konsistent. d.h. die gleichen Schlüssel können in verschiedenen Reihenfolgen erscheinen. Die Implementierung von HashMap hat sich zwischen Java 7 und Java 8 erheblich geändert, so dass Sie in einigen Fällen mit einer anderen Reihenfolge rechnen müssen.

14

HashMap garantiert nicht die Reihenfolge der Schlüssel. Wenn dein Junit-Test auf der Reihenfolge der Schlüssel beruht, ist er falsch ausgelegt.

3

Das ist eine HashSet/HashMap, bei der die Reihenfolge nie garantiert ist und jederzeit geändert werden kann. Was Sie wollen, ist TreeSet or LinkedHashSet, erfahren Sie hier über Unterschiede.