Java中LinkedHashMap的實(shí)現(xiàn)詳解
前言
在Java中,Map容器是一個(gè)非常常用的數(shù)據(jù)結(jié)構(gòu),用于存儲(chǔ)一組鍵值對。在一些場景下,需要對Map容器中的元素進(jìn)行有序存儲(chǔ),并且還需要支持常見的Map操作,例如插入、刪除、查找等等。LinkedHashMap就是一個(gè)可以滿足這些要求的Map容器。
摘要
LinkedHashMap是Java中的一個(gè)Map容器,它繼承自HashMap,并且還可以對元素進(jìn)行有序存儲(chǔ)。在LinkedHashMap中,元素的順序可以按照插入順序或者訪問順序進(jìn)行排列。在插入順序模式下,元素按照插入順序進(jìn)行排列。在訪問順序模式下,每次訪問一個(gè)元素之后,該元素都會(huì)被提到最后面,保證最后被訪問的元素永遠(yuǎn)在最后面。
本文將介紹LinkedHashMap的實(shí)現(xiàn)原理以及使用方法,并且提供相應(yīng)的測試用例和全文小結(jié)。
LinkedHashMap
實(shí)現(xiàn)原理
LinkedHashMap實(shí)現(xiàn)有序存儲(chǔ)的方式是維護(hù)一個(gè)雙向鏈表,用于記錄元素的插入順序或者訪問順序。在LinkedHashMap中,每個(gè)元素都是一個(gè)鏈表節(jié)點(diǎn),包含了前驅(qū)節(jié)點(diǎn)、后繼節(jié)點(diǎn)、鍵、值等信息。插入或者訪問一個(gè)元素時(shí),會(huì)將它對應(yīng)的節(jié)點(diǎn)移動(dòng)到鏈表的末尾。
在LinkedHashMap內(nèi)部,有一個(gè)成員變量accessOrder,用于表示當(dāng)前使用的順序模式。如果accessOrder為true,則表示當(dāng)前使用的是訪問順序模式;如果accessOrder為false,則表示當(dāng)前使用的是插入順序模式。在訪問順序模式下,每次訪問一個(gè)元素時(shí),會(huì)將它對應(yīng)的節(jié)點(diǎn)移動(dòng)到鏈表的末尾。
在LinkedHashMap中,插入或者刪除一個(gè)元素時(shí),會(huì)同時(shí)更新雙向鏈表。在插入一個(gè)元素時(shí),會(huì)將它對應(yīng)的節(jié)點(diǎn)放到鏈表的末尾;在刪除一個(gè)元素時(shí),會(huì)直接刪除對應(yīng)的節(jié)點(diǎn),并且修改前驅(qū)節(jié)點(diǎn)和后繼節(jié)點(diǎn)的指針。
在LinkedHashMap中,還有一個(gè)重要的成員變量modCount,用于記錄Map容器的結(jié)構(gòu)修改次數(shù)。任何會(huì)修改Map結(jié)構(gòu)的操作,例如插入、刪除、重建等等,都會(huì)導(dǎo)致modCount的值增加??梢岳胢odCount來檢測容器內(nèi)部結(jié)構(gòu)是否發(fā)生變化。
使用方法
LinkedHashMap的使用方法和HashMap基本相同??梢酝ㄟ^以下方式創(chuàng)建一個(gè)LinkedHashMap對象:
Map<K, V> map = new LinkedHashMap<>();
在創(chuàng)建LinkedHashMap對象時(shí),還可以傳入一個(gè)initialCapacity參數(shù),用于指定Map容器的初始容量;以及一個(gè)loadFactor參數(shù),用于指定Map容器的負(fù)載因子。
LinkedHashMap提供了常見的Map操作,例如put、get、remove等等。在LinkedHashMap中,還可以通過以下方法來修改順序模式:
Map<K, V> map = new LinkedHashMap<>(); // 構(gòu)造一個(gè)使用訪問順序模式的LinkedHashMap map.get(key); // 訪問一個(gè)元素,會(huì)將對應(yīng)的節(jié)點(diǎn)移動(dòng)到鏈表的末尾
在使用訪問順序模式時(shí),還可以通過以下方法來獲取最先訪問的元素:
Map<K, V> map = new LinkedHashMap<>(); // 構(gòu)造一個(gè)使用訪問順序模式的LinkedHashMap K firstKey = map.keySet().iterator().next(); // 獲取最先訪問的元素
LinkedHashMap代碼方法介紹
構(gòu)造方法
public LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder)
構(gòu)造一個(gè)LinkedHashMap對象。其中,initialCapacity表示Map容器的初始容量;loadFactor表示Map容器的負(fù)載因子;accessOrder表示Map容器的順序模式,true表示訪問順序模式,false表示插入順序模式。
put方法
public V put(K key, V value)
向Map容器中插入一個(gè)元素。其中,key表示元素的鍵;value表示元素的值。
get方法
public V get(Object key)
獲取Map容器中指定鍵對應(yīng)的值。其中,key表示指定的鍵。
remove方法
public V remove(Object key)
刪除Map容器中指定鍵對應(yīng)的元素。其中,key表示指定的鍵。
測試用例
以下是一個(gè)使用LinkedHashMap的測試用例,在該測試用例中,首先創(chuàng)建一個(gè)使用插入順序模式的LinkedHashMap對象,然后向Map容器中插入3個(gè)元素;接著訪問第2個(gè)元素,并向Map容器中插入1個(gè)元素;最后遍歷Map容器,輸出所有元素的鍵和值,以及最先插入和最后插入的元素的鍵和值。
package com.example.demo.javaTest.map; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import java.util.LinkedHashMap; import java.util.Map; /** * @Date 2023-09-09 20:58 */ @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class LinkedHashMapTest { @Test public void linkedHashMapTest() { //創(chuàng)建一個(gè)LinkedHashMap集合 Map<Integer, String> map = new LinkedHashMap<>(); map.put(1, "a"); map.put(2, "b"); map.put(3, "c"); map.get(2); System.out.println("map.get(2) = " + map.get(2)); map.put(4, "d"); //存放最后一個(gè)key Integer lastKey = null; for (Map.Entry<Integer, String> entry : map.entrySet()) { lastKey = entry.getKey(); System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue()); } Integer firstKey = map.keySet().iterator().next(); System.out.println("First key: " + firstKey + ", First value: " + map.get(firstKey)); System.out.println("Last key: " + lastKey + ", Last value: " + map.get(lastKey)); } }
運(yùn)行結(jié)果如下:
全文小結(jié)
本文介紹了Java中的LinkedHashMap,它可以實(shí)現(xiàn)有序存儲(chǔ),并且支持常見的Map操作。在內(nèi)部實(shí)現(xiàn)中,LinkedHashMap維護(hù)了一個(gè)雙向鏈表,用于記錄元素的順序。在使用LinkedHashMap時(shí),可以選擇使用插入順序模式或者訪問順序模式。LinkedHashMap提供了常見的Map操作,例如put、get、remove等等。在使用訪問順序模式時(shí),還可以通過方法來獲取最先訪問的元素和最后訪問的元素。最后,我們還提供了一個(gè)使用LinkedHashMap的測試用例,方便大家進(jìn)行參考。
以上就是Java中LinkedHashMap的實(shí)現(xiàn)詳解的詳細(xì)內(nèi)容,更多關(guān)于Java LinkedHashMap的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Spring Boot實(shí)現(xiàn)STOMP協(xié)議的WebSocket的方法步驟
這篇文章主要介紹了Spring Boot實(shí)現(xiàn)STOMP協(xié)議的WebSocket的方法步驟,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-05-05使用arthas命令redefine實(shí)現(xiàn)Java熱更新(推薦)
今天分享一個(gè)非常重要的命令 redefine ,主要作用是加載外部的 .class 文件,用來替換 JVM 已經(jīng)加載的類,總結(jié)起來就是實(shí)現(xiàn)了 Java 的熱更新,感興趣的朋友跟隨小編一起看看吧2020-05-05Java使用@Autowired注解獲取對象為null的幾種情況及解決方法
這篇文章主要給大家介紹了使用@Autowired注解獲取對象為null的幾種情況以及?解決方法,文中有詳細(xì)的代碼示例講解,具有一定的參考價(jià)值,需要的朋友可以參考下2023-09-09深入淺析springboot中static和templates區(qū)別
這篇文章主要介紹了springboot中static和templates區(qū)別,本文通過圖文實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02SpringBoot通過注解監(jiān)測Controller接口的代碼示例
在Spring Boot中,度量指標(biāo)(Metrics)是監(jiān)控和診斷應(yīng)用性能與行為的重要工具,Spring Boot通過集成Micrometer和Spring Boot Actuator,提供了強(qiáng)大的度量指標(biāo)收集與暴露功能,本文介紹了SpringBoot通過注解監(jiān)測Controller接口,需要的朋友可以參考下2024-07-07Java多種經(jīng)典排序算法(含動(dòng)態(tài)圖)
排序算法是老生常談的了,但是在面試中也有會(huì)被問到,例如有時(shí)候,在考察算法能力的時(shí)候,不讓你寫算法,就讓你描述一下,某個(gè)排序算法的思想以及時(shí)間復(fù)雜度或空間復(fù)雜度。我就遇到過,直接問快排的,所以這次我就總結(jié)梳理一下經(jīng)典的十大排序算法以及它們的模板代碼2021-04-04