Java有序的Map LinkedHashMap用法詳解
LinkedHashMap
1.定義:
LinkedHashMap是HashMap和雙向鏈表的合二為一,即一個(gè)將所有Entry節(jié)點(diǎn)鏈入一個(gè)雙向鏈表的HashMap(LinkedHashMap = HashMap + 雙向鏈表)
LinkedHashMap和HashMap是Java Collection Framework 的重要成員,也是Map族(如下圖所示)
LinkedHashMap是HashMap的子類(擁有HashMap的所有特性)
LinkedHashMap和HashMap最多只允許一條Entry的鍵為Null(多條會(huì)覆蓋),但允許多條Entry的值為Null
LinkedHashMap 也是 Map 的一個(gè)非同步的實(shí)現(xiàn)
LinkedHashMap很好的支持LRU算法
HashMap是無序的,LinkedHashMap通過維護(hù)一個(gè)額外的雙向鏈表保證了迭代順序
迭代順序可以是插入順序,也可以是訪問順序(即根據(jù)鏈表中元素的順序可以將LinkedHashMap分為:保持插入順序的LinkedHashMap和保持訪問順序的LinkedHashMap,其中LinkedHashMap的默認(rèn)實(shí)現(xiàn)是按插入順序排序的)
LinkedHashMap簡介
LinkedHashMap是Java提供的一個(gè)集合類,它繼承自HashMap,并在HashMap基礎(chǔ)上維護(hù)一條雙向鏈表,使得具備如下特性:
支持遍歷時(shí)會(huì)按照插入順序有序進(jìn)行迭代。
支持按照元素訪問順序排序,適用于封裝LRU緩存工具。
因?yàn)閮?nèi)部使用雙向鏈表維護(hù)各個(gè)節(jié)點(diǎn),所以遍歷時(shí)的效率和元素個(gè)數(shù)成正比,相較于和容量成正比的HashMap來說,迭代效率會(huì)高很多。
LinkedHashMap邏輯結(jié)構(gòu)如下圖所示,它是在HashMap基礎(chǔ)上在各個(gè)節(jié)點(diǎn)之間維護(hù)一條雙向鏈表,使得原本散列在不同bucket上的節(jié)點(diǎn)、鏈表、紅黑樹有序關(guān)聯(lián)起來。
下面看下java 有序的Map LinkedHashMap簡介,內(nèi)容如下所示:
無序的HashMap
我們知道HashMap是無需的,數(shù)據(jù)并不是按我們插入的順序排序的,我們可以驗(yàn)證下
public class Test6 { public static void main(String[] args) { Map<String, String> hashMap = new HashMap<String, String>(); hashMap.put("name1", "value1"); hashMap.put("name2", "value2"); hashMap.put("name3", "value3"); Set<Entry<String, String>> set = hashMap.entrySet(); Iterator<Entry<String, String>> iterator = set.iterator(); while(iterator.hasNext()) { Entry<String, String> entry = iterator.next(); String key = (String) entry.getKey(); String value = (String) entry.getValue(); System.out.println("key:" + key + ", value:" + value); } } }
可以看到輸出結(jié)果并不是按數(shù)據(jù)插入的順序的
key:name3, value:value3
key:name2, value:value2
key:name1, value:value1
有序的LinkedHashMap
要想實(shí)現(xiàn)有序的Map,我們可以用LinkedHashMap,下面驗(yàn)證一下,把原來代碼的HashMap替換成LinkedHashMap
public class Test6 { public static void main(String[] args) { Map<String, String> hashMap = new LinkedHashMap<String, String>(); hashMap.put("name1", "value1"); hashMap.put("name2", "value2"); hashMap.put("name3", "value3"); Set<Entry<String, String>> set = hashMap.entrySet(); Iterator<Entry<String, String>> iterator = set.iterator(); while(iterator.hasNext()) { Entry<String, String> entry = iterator.next(); String key = (String) entry.getKey(); String value = (String) entry.getValue(); System.out.println("key:" + key + ", value:" + value); } } }
可以看到輸出結(jié)果為我們插入的順序
key:name1, value:value1
key:name2, value:value2
key:name3, value:value3
到此這篇關(guān)于java 有序的Map LinkedHashMap簡介的文章就介紹到這了,更多相關(guān)java Map LinkedHashMap內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
手把手教你設(shè)置IntelliJ IDEA 的彩色代碼主題的圖文教程
本文給出一系列 IntelliJ IDEA 代碼的彩色主題,感興趣的朋友一起看看吧2018-01-01詳解在IDEA中使用MyBatis Generator逆向工程生成代碼
這篇文章主要介紹了詳解在IDEA中使用MyBatis Generator逆向工程生成代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-06-06SpringBoot整合HikariCP數(shù)據(jù)庫連接池方式
這篇文章主要介紹了SpringBoot整合HikariCP數(shù)據(jù)庫連接池方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03Mac安裝多個(gè)JDK并實(shí)現(xiàn)動(dòng)態(tài)切換
有時(shí)候我們有多個(gè)項(xiàng)目需要使用多個(gè)版本JDK,本文主要介紹了Mac安裝多個(gè)JDK并實(shí)現(xiàn)動(dòng)態(tài)切換,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07IDEA部署JavaWeb項(xiàng)目到Tomcat服務(wù)器的方法
這篇文章主要介紹了IDEA部署JavaWeb項(xiàng)目到Tomcat服務(wù)器的方法,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧2018-06-06SpringBoot自動(dòng)配置特點(diǎn)與原理詳細(xì)分析
這篇文章主要介紹了SpringBoot自動(dòng)配置原理分析,SpringBoot是我們經(jīng)常使用的框架,那么你能不能針對(duì)SpringBoot實(shí)現(xiàn)自動(dòng)配置做一個(gè)詳細(xì)的介紹。如果可以的話,能不能畫一下實(shí)現(xiàn)自動(dòng)配置的流程圖。牽扯到哪些關(guān)鍵類,以及哪些關(guān)鍵點(diǎn)2022-08-08Java中MyBatis傳入?yún)?shù)parameterType問題
這篇文章主要介紹了Java中MyBatis傳入?yún)?shù)parameterType問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12