Hashmap基於數組加鏈表結構保存數據,遍歷時基本可以視為通過hashCode進行遍歷。
但是有兩個特殊點:
①:初始化hashmap時,如果指定的hash桶數(小於16)不壹致,則(n-1)&;哈希得到的數組下標不壹致。遍歷的順序將會改變。
②:發生哈希沖突,同時沖突鏈表的長度小於9。哈希桶容量大於64;此時根據鏈表存儲,這部分數據遍歷可能是基於插入順序。(有待核實)
示例1:
HashMap map 1 = new HashMap & lt;& gt();
map 1 . put(“123“,“AAA“);
map 1 . put(“23456“,“BBB“);
系統。out . println(“map 1的循環遍歷“);
供(圖。entry entry:map 1 . entry set()){
system . out . println(entry . getkey());
}
HashMap map2 = new HashMap & lt& gt(map 1 . size());
map 2 . put(“123“,“AAA“);
map 2 . put(“23456“,“BBB“);
系統。out . println(“map 2的循環遍歷“);
供(圖。Entry條目:map 2 . entry set()){
system . out . println(entry . getkey());
}
回到第二個問題:fastJson.toJson()?基於以上兩個隱患,秩序就沒有保障了嗎?JSONObject基於Map.entrySet()遍歷Map,而entrySet通過bucket 0節點循環遍歷數組和鏈表,此時的數據無法保證完全壹致。