[英]HashMap where the order of keys is important
我使用 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 更能保留顺序?
LinkedHashMap
维护插入顺序。 除此之外,还有各种SortedMap
实现,例如TreeMap
。
您可以在 SO 上查看这个问题: Java 如何对 HashMap 或 HashTable 中的项目进行排序?
可以给你更清晰的图...
从该图表中,您可以看到与 Java 11 捆绑在一起的Map
的各种实现之间的不同行为。请注意“迭代顺序”列。
如果您希望地图根据键的值进行排序来维护顺序,请使用实现SortedMap
或其后继NavigableMap
。 这意味着TreeMap
,或者如果您需要并发, ConcurrentSkipListMap
。
如果要保持原始插入顺序,请使用LinkedHashMap
。
如果您将枚举对象作为键,请使用EnumMap
来维护键,以便定义枚举。
与 Java 11 捆绑在一起的所有其他Map
实现都没有承诺键的顺序,因此请避免使用它们。 您还可以考虑使用Map
3rd 方实现,例如在Google Guava库中找到的那些。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.