更新時間:2022-06-10 09:45:26 來源:動力節(jié)點 瀏覽2458次
相信大家對HashMap是什么已經(jīng)有所了解,那么HashMap是有序的嗎?動力節(jié)點小編來為大家解答。
首先說明:HashMap不保證插入順序,但是循環(huán)遍歷時,輸出順序是不會改變的。
代碼說明
public class HashMapTest {
public static void main(String[] args) {
HashMap<String, String> map = new HashMap<>();
map.put("aaa", "aaa");
map.put("bbb", "bbb");
map.put("ccc", "ccc");
System.out.println("第一次輸出:");
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println(entry.getKey());
}
System.out.println("\n第二次輸出:");
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println(entry.getKey());
}
}
}
輸出:
第一次輸出:
aaa
ccc
bbb
第二次輸出:
aaa
ccc
bbb
項目開發(fā)過程中,遇到類似的如下代碼,即,兩個Map,put的key值相同,但是兩個Map最后循環(huán)遍歷輸出的key順序卻不一樣
public class HashMapTest {
public static void main(String[] args) {
HashMap<String, String> map1 = new HashMap<>();
map1.put("123", "aaa");
map1.put("23456", "bbb");
System.out.println("map1的循環(huán)遍歷");
for (Map.Entry<String, String> entry : map1.entrySet()) {
System.out.println(entry.getKey());
}
HashMap<String, String> map2 = new HashMap<>(map1.size());
map2.put("123", "aaa");
map2.put("23456", "bbb");
System.out.println("map2的循環(huán)遍歷");
for (Map.Entry<String, String> entry : map2.entrySet()) {
System.out.println(entry.getKey());
}
}
}
代碼輸出為:
map1的循環(huán)遍歷
123
23456
map2的循環(huán)遍歷
23456
123
HashMap的數(shù)據(jù)結構:數(shù)組+單鏈表,當存在hashCode相同的不同對象時,會將value以單鏈表的形式,往后追加。數(shù)組加快訪問速度,單鏈表解決hash值沖突
調用put方法時,發(fā)生了什么:根據(jù)key的hashCode,計算出將key放入數(shù)組的index下標,index= (數(shù)組長度 - 1) & hashCode
HashMap循環(huán)遍歷的順序:根據(jù)數(shù)組順序+單鏈表順序進行輸出。雖然遍歷時,用的EntrySet,但是可以簡單理解為,兩層循環(huán)輸出數(shù)據(jù),外層循環(huán)為遍歷數(shù)組,內層循環(huán)為遍歷單鏈表
HashMap在初始化時,默認初始容量為16,以及默認的擴容因子0.75(在此處就不詳細介紹了)
基于如上HashMap的特性,仔細看map2的初始化,會發(fā)現(xiàn)
HashMap<String, String> map2 = new HashMap<>(map1.size());
即:map2的初始化容量=map1.size()。
這個設置,導致相同的key,在put到map2時,計算出的index值,與map1中的不一樣
因為計算index時,依賴于數(shù)組的長度(參考上面:put方法調用說明)
若兩個Map的初始化容量不一致,就算同時插入相同的key,最后輸出的順序,不一定一直
代碼規(guī)范性挺重要的,想要依賴Map保持有序性,請使用LinkedHashMap
以上就是關于“一文告訴你HashMap是有序的嗎”介紹,大家如果想了解更多相關知識,不妨來關注一下動力節(jié)點的HashMap底層實現(xiàn)原理視頻教程,里面的課程內容由淺到深,通俗易懂,相信對大家的學習一定會有所幫助的。