问:简单说说 HashMap 和 LinkedHashMap 的区别?
答:HashMap 可以允许一条键为 Null 的键值对,允许多条值为 Null 的键值对,其并发不安全,如果想并发安全操作可以使用
Collections.synchronizedMap() 方法或 ConcurrentHashMap 来代替。
LinkedHashMap 是 HashMap 的一个子类,其特殊实现的仅仅是保存了记录的插入顺序,所以在 Iterator 迭代器遍历 LinkedHashMap 时先得到的键值对是先插入的(也可以在构造时用带参数构造方法来改变顺序为按照使用进行排序),由于其存储沿用了 HashMap 结构外还多了一个双向顺序链表,所以在一般场景下遍历时会比 HashMap 慢,此外具备 HashMap 的所有特性和缺点。
所以一般情况下,用的最多的是 HashMap,如果需要按照插入或者读取顺序来排列时就使用 LinkedHashMap。
问:下面程序片段的输出正确吗?
Map<String, String> linkedMap = new LinkedHashMap<String, String>();
linkedMap.put("b", "2");
linkedMap.put("a", "1");
linkedMap.put("c", "3");
String jsonStr = JSON.toJSONString(linkedMap);
System.out.println(jsonStr);
//输出jsonStr={"a":"1","b":"2","c":"3"}
Map<String, String> linkedMap1 = new LinkedHashMap<String, String>();
linkedMap1.put("b", "2");
linkedMap1.put("a", "1");
linkedMap1.put("c", "3");
Gson gson = new GsonBuilder().enableComplexMapKeySerialization().create();
String jsonStr1 = gson.toJson(linkedMap1);
System.out.println(jsonStr1);
//输出jsonStr1={"b":"2","a":"1","c":"3"}
答:上面两段代码的输出均正确。
因为 LinkedHashMap 是有序的 (按插入顺序),而使用 JDK 自带 JSON 序列化类或者 fastJson 进行默认设置的 JSON 序列化后默认是无序的,如果想要有序就需要特殊设置,而代码段 2 中有序是 GSON 保证的。