繁体   English   中英

HashMap,其中键的顺序很重要

[英]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的各种实现之间的不同行为。请注意“迭代顺序”列。

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

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

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

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

与 Java 11 捆绑在一起的所有其他Map实现都没有承诺键的顺序,因此请避免使用它们。 您还可以考虑使用Map 3rd 方实现,例如在Google Guava库中找到的那些。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM