HashMap,其中键的顺序很重要

时间:2012-06-11 04:48:43

标签: java map hashmap

我使用HashMaps存储对的集合,但我还必须确保从第一个json序列化(从Php客户端)到Java HashMap集浏览,键的顺序是一样的

//import com.google.gson.Gson;
//import com.google.common.base.Joiner;  
String s = "{\"durant\":\"kevin\", \"james\":\"lebron\",\"harden\":\"james\",\"westbrook\":\"russel\"}";
System.out.println(s);
Gson gson = new Gson();
Type typeOfMap = new TypeToken<Map<String, String>>() {}.getType();
Map<String, String> m = gson.fromJson(s, typeOfMap);
List<String> entries = new ArrayList< String>(m.keySet());
//Collections.sort(entries);
System.out.println(entries);
System.out.println(m.entrySet());
System.out.println( Joiner.on(",").withKeyValueSeparator("").join(m) );

它似乎适用于小的值集,没有再次排序(这里按字母顺序排列),但它是一种可靠的方法吗?可以在json String和Map浏览之间改变顺序吗?

编辑:可能LinkedHashMap更多订单保留?

3 个答案:

答案 0 :(得分:2)

LinkedHashMap维护插入顺序。除此之外,还有各种SortedMap实施,例如TreeMap

答案 1 :(得分:0)

您可以在SO上查看此问题: How does Java order items in a HashMap or a HashTable?

可以给你一个更清晰的画面......

答案 2 :(得分:0)

从此图表中,您可以看到Java 11捆绑的Map的各种实现之间的不同行为。请注意“迭代顺序”列。

Table of map implementations in Java 11, comparing their features

如果您希望地图根据键值的排序保持顺序,请使用实现SortedMap或其后继者NavigableMap的实现。这意味着TreeMap,或者如果需要并发,则ConcurrentSkipListMap

如果要保留原始的插入顺序,请使用LinkedHashMap

如果您有枚举对象作为键,请使用EnumMap来维护键,以便定义枚举。

与Java 11捆绑在一起的所有其他Map实现都不保证键的顺序,因此请避免使用它们。您还可以考虑使用Map的第三方实现,例如在 Google Guava 库中找到的实现。