首先结果:并不能保证一致。
hashmap 基于数组加链表结构保存数据,遍历时,基本上可以视为通过hashCode遍历。
但是有特殊两点:
①:如果初始化hashmap时,指定的hash桶数量(小于16)如果不一致,那么 (n-1)& hash 所得的数组下标不一致。遍历的顺序将改变
②:发生hash冲突,同时,冲突的链表长度小于9. hash桶容量大于64; 此时按照链表存储,这部分数据遍历可能基于插入的顺序。(待验证)
例①:
HashMap map1 =new HashMap<>();
map1.put("123", "aaa");
map1.put("23456", "bbb");
System.out.println("map1的循环遍历");
for (Map.Entry entry : map1.entrySet()) {
System.out.println(entry.getKey());
}
HashMap map2 =new HashMap<>(map1.size());
map2.put("123", "aaa");
map2.put("23456", "bbb");
System.out.println("map2的循环遍历");
for (Map.Entry entry : map2.entrySet()) {
System.out.println(entry.getKey());
}
回到第二个问题:fastJson.toJson() 基于以上两点隐患,无法保证有序 JSONObject是基于Map.entrySet()遍历Map,而entrySet通过桶0节点循环遍历数组、链表,此时的数据并不能保证完全一致