Java 8 HashMap KeySet()输出不同于Java 7

问题描述:

我从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' –

Set不保证元素的顺序。如果你需要订购hashmap,你可以使用LinkedHashMap

如果你想保留插入顺序,建议使用LinkedHashMap

HashMap的订单没有定义,也不一致。即相同的键可以以不同的顺序出现。 HashMap的实现在Java 7和Java 8之间有了很大的变化,所以您应该期望在某些情况下订单有所不同。

HashMap不保证密钥的顺序。如果您的Junit测试依赖于密钥的顺序,那么它的设计不正确。

这是一个HashSet/HashMap,其中的顺序永远不会保证,并且可以随时更改。你想要的是TreeSet or LinkedHashSet,在这里了解差异。