Java中LinkedHashMap的實現(xiàn)詳解
前言
在Java中,Map容器是一個非常常用的數(shù)據(jù)結(jié)構(gòu),用于存儲一組鍵值對。在一些場景下,需要對Map容器中的元素進行有序存儲,并且還需要支持常見的Map操作,例如插入、刪除、查找等等。LinkedHashMap就是一個可以滿足這些要求的Map容器。
摘要
LinkedHashMap是Java中的一個Map容器,它繼承自HashMap,并且還可以對元素進行有序存儲。在LinkedHashMap中,元素的順序可以按照插入順序或者訪問順序進行排列。在插入順序模式下,元素按照插入順序進行排列。在訪問順序模式下,每次訪問一個元素之后,該元素都會被提到最后面,保證最后被訪問的元素永遠在最后面。
本文將介紹LinkedHashMap的實現(xiàn)原理以及使用方法,并且提供相應(yīng)的測試用例和全文小結(jié)。
LinkedHashMap
實現(xiàn)原理
LinkedHashMap實現(xiàn)有序存儲的方式是維護一個雙向鏈表,用于記錄元素的插入順序或者訪問順序。在LinkedHashMap中,每個元素都是一個鏈表節(jié)點,包含了前驅(qū)節(jié)點、后繼節(jié)點、鍵、值等信息。插入或者訪問一個元素時,會將它對應(yīng)的節(jié)點移動到鏈表的末尾。
在LinkedHashMap內(nèi)部,有一個成員變量accessOrder,用于表示當前使用的順序模式。如果accessOrder為true,則表示當前使用的是訪問順序模式;如果accessOrder為false,則表示當前使用的是插入順序模式。在訪問順序模式下,每次訪問一個元素時,會將它對應(yīng)的節(jié)點移動到鏈表的末尾。
在LinkedHashMap中,插入或者刪除一個元素時,會同時更新雙向鏈表。在插入一個元素時,會將它對應(yīng)的節(jié)點放到鏈表的末尾;在刪除一個元素時,會直接刪除對應(yīng)的節(jié)點,并且修改前驅(qū)節(jié)點和后繼節(jié)點的指針。
在LinkedHashMap中,還有一個重要的成員變量modCount,用于記錄Map容器的結(jié)構(gòu)修改次數(shù)。任何會修改Map結(jié)構(gòu)的操作,例如插入、刪除、重建等等,都會導致modCount的值增加??梢岳胢odCount來檢測容器內(nèi)部結(jié)構(gòu)是否發(fā)生變化。
使用方法
LinkedHashMap的使用方法和HashMap基本相同??梢酝ㄟ^以下方式創(chuàng)建一個LinkedHashMap對象:
Map<K, V> map = new LinkedHashMap<>();
在創(chuàng)建LinkedHashMap對象時,還可以傳入一個initialCapacity參數(shù),用于指定Map容器的初始容量;以及一個loadFactor參數(shù),用于指定Map容器的負載因子。
LinkedHashMap提供了常見的Map操作,例如put、get、remove等等。在LinkedHashMap中,還可以通過以下方法來修改順序模式:
Map<K, V> map = new LinkedHashMap<>(); // 構(gòu)造一個使用訪問順序模式的LinkedHashMap map.get(key); // 訪問一個元素,會將對應(yīng)的節(jié)點移動到鏈表的末尾
在使用訪問順序模式時,還可以通過以下方法來獲取最先訪問的元素:
Map<K, V> map = new LinkedHashMap<>(); // 構(gòu)造一個使用訪問順序模式的LinkedHashMap K firstKey = map.keySet().iterator().next(); // 獲取最先訪問的元素
LinkedHashMap代碼方法介紹
構(gòu)造方法
public LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder)
構(gòu)造一個LinkedHashMap對象。其中,initialCapacity表示Map容器的初始容量;loadFactor表示Map容器的負載因子;accessOrder表示Map容器的順序模式,true表示訪問順序模式,false表示插入順序模式。
put方法
public V put(K key, V value)
向Map容器中插入一個元素。其中,key表示元素的鍵;value表示元素的值。
get方法
public V get(Object key)
獲取Map容器中指定鍵對應(yīng)的值。其中,key表示指定的鍵。
remove方法
public V remove(Object key)
刪除Map容器中指定鍵對應(yīng)的元素。其中,key表示指定的鍵。
測試用例
以下是一個使用LinkedHashMap的測試用例,在該測試用例中,首先創(chuàng)建一個使用插入順序模式的LinkedHashMap對象,然后向Map容器中插入3個元素;接著訪問第2個元素,并向Map容器中插入1個元素;最后遍歷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)建一個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");
//存放最后一個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));
}
}運行結(jié)果如下:

全文小結(jié)
本文介紹了Java中的LinkedHashMap,它可以實現(xiàn)有序存儲,并且支持常見的Map操作。在內(nèi)部實現(xiàn)中,LinkedHashMap維護了一個雙向鏈表,用于記錄元素的順序。在使用LinkedHashMap時,可以選擇使用插入順序模式或者訪問順序模式。LinkedHashMap提供了常見的Map操作,例如put、get、remove等等。在使用訪問順序模式時,還可以通過方法來獲取最先訪問的元素和最后訪問的元素。最后,我們還提供了一個使用LinkedHashMap的測試用例,方便大家進行參考。
以上就是Java中LinkedHashMap的實現(xiàn)詳解的詳細內(nèi)容,更多關(guān)于Java LinkedHashMap的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringMVC攔截器實現(xiàn)監(jiān)聽session是否過期詳解
這篇文章主要介紹了SpringMVC攔截器實現(xiàn)監(jiān)聽session是否過期詳解,還是比較不錯的,這里分享給大家,供需要的朋友參考。2017-11-11
Java深入了解數(shù)據(jù)結(jié)構(gòu)之哈希表篇
哈希表是一種根據(jù)關(guān)鍵碼去尋找值的數(shù)據(jù)映射結(jié)構(gòu),該結(jié)構(gòu)通過把關(guān)鍵碼映射的位置去尋找存放值的地方,說起來可能感覺有點復雜,我想我舉個例子你就會明白了,最典型的的例子就是字典2022-01-01
Java各種排序算法匯總(冒泡,選擇,歸并,希爾及堆排序等)
這篇文章主要介紹了Java各種排序算法,以大量實例形式匯總分析了Java常用的各種排序算法,包括冒泡排序、快速排序、堆排序、插入排序、希爾排序、選擇排序、歸并排序等,需要的朋友可以參考下2015-11-11
idea mabatisX插件生成mapper.xml文件全過程
文章介紹了如何在IntelliJ IDEA中使用MybatisX插件自動生成MyBatis的Mapper和XML文件,步驟包括安裝插件、選擇數(shù)據(jù)庫表并右鍵選擇MybatisX-Generator進行配置和生成2026-03-03
elasticsearch元數(shù)據(jù)構(gòu)建metadata及routing類源碼分析
這篇文章主要為大家介紹了elasticsearch元數(shù)據(jù)構(gòu)建metadata?routing類內(nèi)部源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-04-04
Java實現(xiàn)訂單超時未支付自動取消的8種方法總結(jié)
這篇文章主要為大家介紹了Java實現(xiàn)訂單超時未支付自動取消功能的8種不同方法,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下2022-08-08

