大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節(jié)點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 hot資訊 一文告訴你HashMap是有序的嗎

一文告訴你HashMap是有序的嗎

更新時間: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的一些特性

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)原理視頻教程,里面的課程內容由淺到深,通俗易懂,相信對大家的學習一定會有所幫助的。

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 天天干天天曰 | 日日摸夜夜爽 | 欧美特级爽毛片 | 精品一区精品二区 | 欧美成人啪啪看片 | 日韩中文在线视频 | 91av综合| 久久综合一区二区 | 综合久久99 | aaa一级黑人毛片 | 国产婷婷综合在线视频中 | 四虎影院观看视频在线观看 | 不卡午夜| 欧美日韩精品一区二区在线线 | 日日操美女 | 天天射天天舔 | 台湾亚洲精品一区二区tv | 奇米影音先锋 | a一区二区三区视频 | 青青青青手机在线视频观看国产 | 成年女人免费看片 | 亚洲精品三区 | 久久久www成人免费精品 | 普通话对白国产情侣自啪 | 日韩中文字幕精品免费一区 | 亚洲欧美精品一区二区 | 香蕉视频a| 国产欧美日韩精品专区 | 爱爱爱久久久久久久 | 站长推荐国产精品视频 | 久久国产精品女 | 大学生不戴套毛片视频 | 国产一级毛片一区二区三区 | 四虎黄色影视 | 国产精品福利一区二区久久 | 中文国产欧美在线观看 | 999成人国产精品 | 在线观看国产精品日本不卡网 | 精品无人区乱码一区2区3区 | 99国产高清久久久久久网站 | 一区毛片|