欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中LinkedHashMap的實(shí)現(xiàn)詳解

 更新時(shí)間:2023年09月17日 14:32:47   作者:我崽不熬夜  
LinkedHashMap是Java中的一個(gè)Map容器,它繼承自HashMap,并且還可以對元素進(jìn)行有序存儲(chǔ),本文將介紹LinkedHashMap的實(shí)現(xiàn)原理以及使用方法,并且提供相應(yīng)的測試用例和全文小結(jié),需要的可以參考下

前言

在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)文章

  • Java中的ThreadPoolExecutor線程池詳解

    Java中的ThreadPoolExecutor線程池詳解

    這篇文章主要介紹了Java中的ThreadPoolExecutor線程池詳解,當(dāng)線程池中的線程數(shù)大于 corePoolSize 時(shí),keepAliveTime 為多余的空閑線程等待新任務(wù)的最長時(shí)間,超過這個(gè)時(shí)間后多余的線程將被終止,需要的朋友可以參考下
    2023-12-12
  • Spring Boot實(shí)現(xiàn)STOMP協(xié)議的WebSocket的方法步驟

    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熱更新(推薦)

    使用arthas命令redefine實(shí)現(xiàn)Java熱更新(推薦)

    今天分享一個(gè)非常重要的命令 redefine ,主要作用是加載外部的 .class 文件,用來替換 JVM 已經(jīng)加載的類,總結(jié)起來就是實(shí)現(xiàn)了 Java 的熱更新,感興趣的朋友跟隨小編一起看看吧
    2020-05-05
  • 從dubbo源碼分析qos-server端口沖突問題及解決

    從dubbo源碼分析qos-server端口沖突問題及解決

    這篇文章主要介紹了從dubbo源碼分析qos-server端口沖突問題及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Java使用@Autowired注解獲取對象為null的幾種情況及解決方法

    Java使用@Autowired注解獲取對象為null的幾種情況及解決方法

    這篇文章主要給大家介紹了使用@Autowired注解獲取對象為null的幾種情況以及?解決方法,文中有詳細(xì)的代碼示例講解,具有一定的參考價(jià)值,需要的朋友可以參考下
    2023-09-09
  • 深入淺析springboot中static和templates區(qū)別

    深入淺析springboot中static和templates區(qū)別

    這篇文章主要介紹了springboot中static和templates區(qū)別,本文通過圖文實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • SpringBoot通過注解監(jiān)測Controller接口的代碼示例

    SpringBoot通過注解監(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-07
  • 簡單談?wù)凧ava中的方法和方法重載

    簡單談?wù)凧ava中的方法和方法重載

    下面小編就為大家?guī)硪黄唵握務(wù)凧ava中的方法和方法重載。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-09-09
  • Java多種經(jīng)典排序算法(含動(dòng)態(tài)圖)

    Java多種經(jīng)典排序算法(含動(dòng)態(tài)圖)

    排序算法是老生常談的了,但是在面試中也有會(huì)被問到,例如有時(shí)候,在考察算法能力的時(shí)候,不讓你寫算法,就讓你描述一下,某個(gè)排序算法的思想以及時(shí)間復(fù)雜度或空間復(fù)雜度。我就遇到過,直接問快排的,所以這次我就總結(jié)梳理一下經(jīng)典的十大排序算法以及它們的模板代碼
    2021-04-04
  • 5種解決Java獨(dú)占寫文件的方法

    5種解決Java獨(dú)占寫文件的方法

    這篇文章主要介紹了5種解決Java獨(dú)占寫文件的方法,需要的朋友可以參考下
    2015-12-12

最新評論