2016-08-01 50 views
3

我從Java 7升級到Java 8,並注意到在使用HashMap的keySet()的地方發生Junit失敗。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(); 

在Java 7:

varKeys=[VAR,VAR1] 

在Java 8:

varKeys=[VAR1,VAR] 

任何幫助?

+6

'Set'和'Map'是按照定義的非訂購集合。在這兩種情況下輸出都是正確的。 – Crozin

+1

你寫的JUNIT測試用例是什麼?在HashMap/Set中不保證順序,如果需要保證順序,可以嘗試TreeSet。 –

+1

'「var1」.toUpperCase()'應該是'VAR1'而不是'var1' –

回答

2

Set不保證元素的順序。如果你需要訂購hashmap,你可以使用LinkedHashMap

6

如果你想保留插入順序,建議使用LinkedHashMap

HashMap的訂單沒有定義,也不一致。即相同的鍵可以以不同的順序出現。 HashMap的實現在Java 7和Java 8之間有了很大的變化,所以您應該期望在某些情況下訂單有所不同。

14

HashMap不保證密鑰的順序。如果您的Junit測試依賴於密鑰的順序,那麼它的設計不正確。

3

這是一個HashSet/HashMap,其中的順序永遠不會保證,並且可以隨時更改。你想要的是TreeSet or LinkedHashSet,在這裏瞭解差異。