Java中LinkedHashMap的实现详解

 更新时间:2023年09月17日 14:32:47   作者:我崽不熬夜  
LinkedHashMap是Java中的一个Map容器,它继承自HashMap,并且还可以对元素进行有序存储,本文将介绍LinkedHashMap的实现原理以及使用方法,并且提供相应的测试用例和全文小结,需要的可以参考下

前言

在Java中,Map容器是一个非常常用的数据结构,用于存储一组键值对。在一些场景下,需要对Map容器中的元素进行有序存储,并且还需要支持常见的Map操作,例如插入、删除、查找等等。LinkedHashMap就是一个可以满足这些要求的Map容器。

摘要

LinkedHashMap是Java中的一个Map容器,它继承自HashMap,并且还可以对元素进行有序存储。在LinkedHashMap中,元素的顺序可以按照插入顺序或者访问顺序进行排列。在插入顺序模式下,元素按照插入顺序进行排列。在访问顺序模式下,每次访问一个元素之后,该元素都会被提到最后面,保证最后被访问的元素永远在最后面。

本文将介绍LinkedHashMap的实现原理以及使用方法,并且提供相应的测试用例和全文小结。

LinkedHashMap

实现原理

LinkedHashMap实现有序存储的方式是维护一个双向链表,用于记录元素的插入顺序或者访问顺序。在LinkedHashMap中,每个元素都是一个链表节点,包含了前驱节点、后继节点、键、值等信息。插入或者访问一个元素时,会将它对应的节点移动到链表的末尾。

在LinkedHashMap内部,有一个成员变量accessOrder,用于表示当前使用的顺序模式。如果accessOrder为true,则表示当前使用的是访问顺序模式;如果accessOrder为false,则表示当前使用的是插入顺序模式。在访问顺序模式下,每次访问一个元素时,会将它对应的节点移动到链表的末尾。

在LinkedHashMap中,插入或者删除一个元素时,会同时更新双向链表。在插入一个元素时,会将它对应的节点放到链表的末尾;在删除一个元素时,会直接删除对应的节点,并且修改前驱节点和后继节点的指针。

在LinkedHashMap中,还有一个重要的成员变量modCount,用于记录Map容器的结构修改次数。任何会修改Map结构的操作,例如插入、删除、重建等等,都会导致modCount的值增加。可以利用modCount来检测容器内部结构是否发生变化。

使用方法

LinkedHashMap的使用方法和HashMap基本相同。可以通过以下方式创建一个LinkedHashMap对象:

Map<K, V> map = new LinkedHashMap<>();

在创建LinkedHashMap对象时,还可以传入一个initialCapacity参数,用于指定Map容器的初始容量;以及一个loadFactor参数,用于指定Map容器的负载因子。

LinkedHashMap提供了常见的Map操作,例如put、get、remove等等。在LinkedHashMap中,还可以通过以下方法来修改顺序模式:

Map<K, V> map = new LinkedHashMap<>(); // 构造一个使用访问顺序模式的LinkedHashMap
map.get(key); // 访问一个元素,会将对应的节点移动到链表的末尾

在使用访问顺序模式时,还可以通过以下方法来获取最先访问的元素:

Map<K, V> map = new LinkedHashMap<>(); // 构造一个使用访问顺序模式的LinkedHashMap
K firstKey = map.keySet().iterator().next(); // 获取最先访问的元素

LinkedHashMap代码方法介绍

构造方法

public LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder)

构造一个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容器中指定键对应的值。其中,key表示指定的键。

remove方法

public V remove(Object key)

删除Map容器中指定键对应的元素。其中,key表示指定的键。

测试用例

以下是一个使用LinkedHashMap的测试用例,在该测试用例中,首先创建一个使用插入顺序模式的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() {
        //创建一个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));
    }
}

运行结果如下:

全文小结

本文介绍了Java中的LinkedHashMap,它可以实现有序存储,并且支持常见的Map操作。在内部实现中,LinkedHashMap维护了一个双向链表,用于记录元素的顺序。在使用LinkedHashMap时,可以选择使用插入顺序模式或者访问顺序模式。LinkedHashMap提供了常见的Map操作,例如put、get、remove等等。在使用访问顺序模式时,还可以通过方法来获取最先访问的元素和最后访问的元素。最后,我们还提供了一个使用LinkedHashMap的测试用例,方便大家进行参考。

以上就是Java中LinkedHashMap的实现详解的详细内容,更多关于Java LinkedHashMap的资料请关注脚本之家其它相关文章!

相关文章

  • Java线程中断interrupt的常用方法

    Java线程中断interrupt的常用方法

    本文主要介绍了Java线程中断interrupt的常用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • java中成员变量与局部变量区别分析

    java中成员变量与局部变量区别分析

    这篇文章主要介绍了java中成员变量与局部变量区别,较为详细的分析了java中成员变量与局部变量的功能、用法与区别,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-01-01
  • httpclient staleConnectionCheckEnabled获取连接流程解析

    httpclient staleConnectionCheckEnabled获取连接流程解析

    这篇文章主要为大家介绍了httpclient staleConnectionCheckEnabled获取连接流程示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • springboot启动前执行方法的四种方式总结

    springboot启动前执行方法的四种方式总结

    这篇文章主要给大家介绍了关于springboot启动前执行方法的四种方式,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-01-01
  • 通过AOP环绕通知如何实现事务控制

    通过AOP环绕通知如何实现事务控制

    这篇文章主要介绍了通过AOP环绕通知如何实现事务控制的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • 如何使用Spring integration在Springboot中集成Mqtt详解

    如何使用Spring integration在Springboot中集成Mqtt详解

    MQTT是多个客户端通过一个中央服务器传递信息的多对多协议,能高效地将信息分发给一个或多个订阅者,下面这篇文章主要给大家介绍了关于如何使用Spring integration在Springboot中集成Mqtt的相关资料,需要的朋友可以参考下
    2023-02-02
  • 基于spring+springmvc+hibernate 整合深入剖析

    基于spring+springmvc+hibernate 整合深入剖析

    这篇文章主要介绍了于spring+springmvc+hibernate整合实例,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • Java网络编程之UDP实现原理解析

    Java网络编程之UDP实现原理解析

    UDP实现通信非常简单,没有服务器,每个都是客户端,每个客户端都需要一个发送端口和一个接收端口,本文给大家介绍Java网络编程之UDP实现原理解析,感兴趣的朋友一起看看吧
    2021-09-09
  • Java程序图形用户界面设计之容器JFrame

    Java程序图形用户界面设计之容器JFrame

    图形界面(简称GUI)是指采用图形方式显示的计算机操作用户界面。与早期计算机使用的命令行界面相比,图形界面对于用户来说在视觉上更易于接受,本篇精讲Java语言中关于图形用户界面的基本容器JFrame
    2022-02-02
  • java获取网络类型的方法

    java获取网络类型的方法

    这篇文章主要介绍了java获取网络类型的方法,涉及java针对网络类型的参数获取及判定技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-10-10

最新评论