2016-08-01 16 views
3

Java 7からJava 8にアップグレードし、HashMapのkeySet()が使用された場所でJunitの障害が発生したことに気付きました。 Javaの7ではJava 8 HashMap KeySet()が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(); 

varKeys=[VAR,VAR1] 

のJava 8では:

varKeys=[VAR1,VAR] 

この上の任意のヘルプ?

+6

'Set'と' Map'は、定義によれば順不同のコレクションです。どちらの場合も出力は正しいです。 – Crozin

+1

あなたが書いたJUNITのテストケースは何ですか?注文はHashMap/Setで保証されません。注文を保証する必要がある場合、TreeSetを試すことができます。 –

+1

'' var1 ".toUpperCase()'は 'var1'ではなく' VAR1'でなければなりません –

答えて

2

Setは要素の順序を保証しません。注文したハッシュマップが必要な場合は、LinkedHashMap

6

のいずれかを使用してください。挿入の順序を保持する場合は、代わりにLinkedHashMapを使用することをおすすめします。

HashMapの順番は定義されておらず、一貫していません。すなわち、同じキーが異なる順序で現れることができる。 HashMapの実装はJava 7とJava 8の間で大幅に変更されているため、場合によっては順序が異なることが予想されます。

14

HashMapキーの順番が間違っています。 Junitテストがキーの順序に依存していた場合は、正しく設計されていません。

3

これはHashSet/HashMapです。注文は保証されず、いつでも変更することができます。あなたが望むのはTreeSet or LinkedHashSetです。違いについてはこちらをご覧ください。

関連する問題