3

我使用 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字符串和地图浏览之间的顺序可以改变吗?

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

4

3 回答 3

3

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

于 2012-06-11T04:53:42.403 回答
0

您可以在 SO 上查看这个问题: Java 如何在 HashMap 或 HashTable 中对项目进行排序?

可以给你更清晰的图...

于 2012-06-11T04:54:56.243 回答
0

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

Java 11 中的地图实现表,比较它们的特性

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

如果要保持原始插入顺序,请使用LinkedHashMap.

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

与 Java 11 捆绑的所有其他Map实现都没有对键的顺序做出任何承诺,因此请避免使用它们。您也可以考虑使用Google GuavaMap中的第三方实现。

于 2020-01-17T02:53:02.573 回答