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是無(wú)序的,LinkedHashMap通過(guò)維護(hù)一個(gè)額外的雙向鏈表保證了迭代順序
迭代順序可以是插入順序,也可以是訪問(wèn)順序(即根據(jù)鏈表中元素的順序可以將LinkedHashMap分為:保持插入順序的LinkedHashMap和保持訪問(wèn)順序的LinkedHashMap,其中LinkedHashMap的默認(rèn)實(shí)現(xiàn)是按插入順序排序的)
LinkedHashMap簡(jiǎn)介
LinkedHashMap是Java提供的一個(gè)集合類,它繼承自HashMap,并在HashMap基礎(chǔ)上維護(hù)一條雙向鏈表,使得具備如下特性:
支持遍歷時(shí)會(huì)按照插入順序有序進(jìn)行迭代。
支持按照元素訪問(wèn)順序排序,適用于封裝LRU緩存工具。
因?yàn)閮?nèi)部使用雙向鏈表維護(hù)各個(gè)節(jié)點(diǎn),所以遍歷時(shí)的效率和元素個(gè)數(shù)成正比,相較于和容量成正比的HashMap來(lái)說(shuō),迭代效率會(huì)高很多。
LinkedHashMap邏輯結(jié)構(gòu)如下圖所示,它是在HashMap基礎(chǔ)上在各個(gè)節(jié)點(diǎn)之間維護(hù)一條雙向鏈表,使得原本散列在不同bucket上的節(jié)點(diǎn)、鏈表、紅黑樹(shù)有序關(guān)聯(lián)起來(lái)。
下面看下java 有序的Map LinkedHashMap簡(jiǎn)介,內(nèi)容如下所示:
無(wú)序的HashMap
我們知道HashMap是無(wú)需的,數(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)證一下,把原來(lái)代碼的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簡(jiǎn)介的文章就介紹到這了,更多相關(guān)java Map LinkedHashMap內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot自定義MessageConverter與內(nèi)容協(xié)商管理器contentNegotiationManag
這篇文章主要介紹了SpringBoot自定義MessageConverter與內(nèi)容協(xié)商管理器contentNegotiationManager的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2022-10-10
Java基礎(chǔ)知識(shí)之成員變量和局部變量淺顯易懂總結(jié)
從語(yǔ)法形式上,看成員變量是屬于類的,而局部變量是在方法中定義的變量或是方法的參數(shù);成員變量可以被public,private,static等修飾符所修飾,而局部變量不能被訪問(wèn)控制修飾符及static所修飾2021-09-09
Java?RabbitMQ的持久化和發(fā)布確認(rèn)詳解
這篇文章主要為大家詳細(xì)介紹了RabbitMQ的持久化和發(fā)布確認(rèn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-03-03
使用Mybatis-plus策略自動(dòng)更新數(shù)據(jù)庫(kù)時(shí)間失敗問(wèn)題解決
這篇文章主要介紹了使用Mybatis-plus策略自動(dòng)更新數(shù)據(jù)庫(kù)時(shí)間失敗問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
idea導(dǎo)入項(xiàng)目爆紅問(wèn)題記錄以及解決
這篇文章主要介紹了idea導(dǎo)入項(xiàng)目爆紅問(wèn)題記錄以及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
JAVA正則表達(dá)式校驗(yàn)qq號(hào)碼的方法
Java作為一種開(kāi)發(fā)語(yǔ)言,有許多值得推薦的地方,但是它一直以來(lái)沒(méi)有自帶對(duì)正則表達(dá)式的支持。下面小編給大家?guī)?lái)了JAVA正則表達(dá)式校驗(yàn)qq號(hào)碼的方法,需要的朋友參考下吧2018-04-04
java獲取網(wǎng)絡(luò)圖片上傳到OSS的方法
這篇文章主要為大家詳細(xì)介紹了java獲取網(wǎng)絡(luò)圖片上傳到OSS,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10
Java消息隊(duì)列JMS實(shí)現(xiàn)原理解析
這篇文章主要介紹了Java消息隊(duì)列JMS實(shí)現(xiàn)原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03

