Java中HashMap的元素遍歷順序問題及處理
一、前言
在項(xiàng)目中遍歷HashMap集合時(shí),發(fā)現(xiàn)遍歷entrySet()的順序與map集合中的順序不一致,特寫此篇文章記錄一下。
HashMap在存儲時(shí)的順序是無序的這個(gè)我是知道的,但是本來以為存儲之后,遍歷的時(shí)候是按照HashMap集合中的順序遍歷的,結(jié)果發(fā)現(xiàn)遍歷的時(shí)候與集合中的順序也不一致。
Map<String,String> map = new HashMap<>();
// map.put() .........
for(Map.Entry<String,String> item:map.entrySet()){
System.out.println(item.getKey()+" "+item.getValue());
}
如上圖:map.entrySet()遍歷后的順序有可能會亂序,與HashMap存儲的順序不一致。
二、原理解釋
在Java中,Map 接口的實(shí)現(xiàn)(如 HashMap,LinkedHashMap,TreeMap 等)并不保證遍歷 keySet() 或 entrySet() 時(shí)的順序。但是,某些特定的 Map 實(shí)現(xiàn)確實(shí)提供了特定的遍歷順序。
- 1、HashMap:它基于哈希表實(shí)現(xiàn),并不保證映射的順序,特別是遍歷順序。因此,當(dāng)你使用 map.keySet() 遍歷 HashMap 時(shí),結(jié)果可能會看起來像是“倒序”或“隨機(jī)”的,但這并不是真正的倒序或隨機(jī),而是基于哈希表和內(nèi)部數(shù)組結(jié)構(gòu)的結(jié)果。
- 2、LinkedHashMap:它維護(hù)了一個(gè)運(yùn)行于所有條目的雙向鏈表。此鏈表定義了迭代順序,通常是按照條目插入到映射中的順序(插入順序)。注意,如果此映射由于重新插入(重新插入鍵/值對)而導(dǎo)致結(jié)構(gòu)修改,則迭代順序可能會受到影響。
- 3、TreeMap:它基于紅黑樹實(shí)現(xiàn),可以保證按照鍵的自然順序或創(chuàng)建 TreeMap 時(shí)提供的 Comparator 進(jìn)行排序。
如果你發(fā)現(xiàn)你的 Map 遍歷結(jié)果看起來像是“倒序”的,并且你沒有使用 LinkedHashMap 或 TreeMap,那么這可能是由于你使用的 Map 實(shí)現(xiàn)(很可能是 HashMap)的內(nèi)部結(jié)構(gòu)導(dǎo)致的。
三、總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot自定義工具類實(shí)現(xiàn)Excel數(shù)據(jù)存入MySQL數(shù)據(jù)庫
這篇文章主要為大家詳細(xì)介紹了如何使用EasyExcel讀取Excel內(nèi)數(shù)據(jù)并轉(zhuǎn)換為csv格式數(shù)據(jù),然后實(shí)現(xiàn)字符串分割,分割出屬性名和屬性值建表插入MySQL數(shù)據(jù)庫中,感興趣的可以了解下2024-03-03
Hikari連接池使用SpringBoot配置JMX監(jiān)控實(shí)現(xiàn)
Hikari是Spring Boot默認(rèn)的數(shù)據(jù)庫連接池。區(qū)別于C3P0直接通過連接池對象獲取各項(xiàng)狀態(tài)指標(biāo),Hikari需要通過JMX來獲取。本文就詳細(xì)的來介紹一下,感興趣的可以了解一下2021-07-07
IDEA調(diào)試源碼小技巧之辨別抽象類或接口多種實(shí)現(xiàn)類的正確路徑
這篇文章主要介紹了IDEA調(diào)試源碼小技巧之辨別抽象類或接口多種實(shí)現(xiàn)類的正確路徑,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01
Java?SpringBoot整合shiro-spring-boot-starterqi項(xiàng)目報(bào)錯(cuò)解決
這篇文章主要介紹了Java?SpringBoot整合shiro-spring-boot-starterqi項(xiàng)目報(bào)錯(cuò)解決,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考一下2022-08-08

