Java 数据结构之-LinkedHashMap

embedded/2025/1/12 17:23:51/

继承关系和基本概念

   LinkedHashMapHashMap的子类,它继承了HashMap的基本功能。它在HashMap的基础上,通过维护一个双向链表来记录元素的插入顺序或者访问顺序(可以通过构造函数指定),从而在遍历元素时能够按照特定的顺序返回元素。

        这种有序性使得LinkedHashMap在一些需要按照特定顺序处理元素的场景中非常有用,例如缓存系统,按照访问顺序来淘汰最近最少访问的元素(LRU 缓存策略)。

底层数据结构组合

   LinkedHashMap底层主要由哈希表(和HashMap类似的数组 + 链表 / 红黑树结构)和一个双向链表组成。

哈希表部分

        哈希表用于快速定位元素。和HashMap一样,它通过对键(key)进行哈希运算,将元素存储在对应的桶(bucket)中。如果多个元素的哈希值对应的桶相同,则在桶内以链表(当链表长度较短时)或者红黑树(当链表长度达到一定阈值时)的形式存储。

        例如,假设有一个简单的哈希函数h(key),对于键k1k2k3,如果h(k1)h(k2)的值相同,那么k1k2会被存储在同一个桶中。如果桶中的元素较多,会根据情况将链表转换为红黑树以提高查找效率。

双向链表部分

        双向链表用于维护元素的顺序。当有新元素插入时,会将元素添加到链表的末尾(如果是按照插入顺序)或者将元素移动到链表的末尾(如果是按照访问顺序)。

        假设已经插入了元素e1e2e3,它们在双向链表中的顺序为

e1->e2->e3

        如果按照插入顺序,当插入新元素e4时,它会被添加到链表的末尾,顺序变为

e1->e2->e3->e4

        如果按照访问顺序,当访问e2时,e2会被移动到链表的末尾,顺序变为

e1->e3->e2

关键操作的实现细节

插入操作(put)

        首先,LinkedHashMap会调用父类HashMapput方法来完成元素在哈希表中的插入操作。这个过程包括计算键的哈希值,找到对应的桶,然后将元素插入桶中(可能是链表或者红黑树)。

        在完成哈希表中的插入后,如果是按照插入顺序维护链表,会将新插入的元素添加到双向链表的末尾。如果是按照访问顺序维护链表,此时新插入的元素就已经在链表的末尾了。

访问操作(get)

        当通过get方法获取元素时,LinkedHashMap同样会先在哈希表中查找元素。找到元素后,如果是按照访问顺序维护链表,会将被访问的元素移动到双向链表的末尾。

        例如,有一个LinkedHashMap对象lhmap,执行Object value = lhmap.get(key)操作时,先在哈希表部分找到对应的元素,然后如果是访问顺序模式,会把这个元素在双向链表中的节点移动到末尾,这样就保证了最近访问的元素总是在链表的末尾,方便实现 LRU 等策略。

遍历操作(entrySet、keySet、values)

在遍历LinkedHashMap时,无论是通过entrySet遍历键值对、keySet遍历键或者values遍历值,都是按照双向链表中元素的顺序进行的。

因为双向链表维护了元素的顺序,所以在遍历过程中能够按照插入顺序或者访问顺序返回元素。例如,通过for (Map.Entry<K, V> entry : lhmap.entrySet())遍历LinkedHashMap,会按照链表中的顺序依次返回键值对。


http://www.ppmy.cn/embedded/153338.html

相关文章

代理模式简介

代理模式是一种设计模式&#xff0c;它允许我们通过一个中介对象来间接访问目标对象&#xff0c;这个中介对象称为“代理”。代理模式的关键在于&#xff0c;它在不改变目标对象代码的前提下&#xff0c;通过引入代理对象来增加额外的功能或控制对目标对象的访问。 代理模式的基…

Windows C++开发环境:VSCode + cmake + ninja + msvc (cl.exe) + msys2/bash shell

这套环境的作用/优点 VSCode&#xff1a;代替Visual Studio, 启动迅速&#xff0c;内存占用小cmake: 与linux一致的构建系统ninja msvc: 用ninja作为cmake的generator, 配合msvc生成工具完成C工程的编译和链接 msvc作为编译工具&#xff0c;而不是msys2或mingw64的gcc&#x…

20250111面试鸭特训营第19天

更多特训营笔记详见个人主页【面试鸭特训营】专栏 1. HTTP 1.0 和 2.0 有什么区别&#xff1f; 名称描述HTML超文本标记语言&#xff0c;描述超文本HTTP超文本传输协议&#xff0c;传输超文本URI统一资源标识符&#xff0c;作为互联网上的唯一标识 HTTP 0.9 最基础的HTTP版本。…

ios越狱脚本巨魔商店安装教程

使用爱思助手安装 安装爱思助手&#xff1a;在电脑上安装 iTunes 和爱思助手&#xff0c;并使用 Apple ID 登录2。 IPA 签名&#xff1a;打开爱思助手&#xff0c;选择工具箱中的 IPA 签名。点击添加 IPA 文件&#xff0c;选择下载的 TrollInstallerX.ipa 文件。选择使用 Apple…

Jenkins使用入门

Jenkins输出hello world Jenkins是一个自动化构建工具&#xff0c;可以理解为可视化的自动脚本工具&#xff0c;类似于提供了一个可视化界面完成Linux下shell脚本的执行工作。为了学习一下Jenkins如何使用&#xff0c;下面执行一个简单的hello world打印任务学习相关流程。 接…

Python入门教程 —— 文件操作

1.文件的打开和关闭 想一想: 如果想用word编写一份简历,应该有哪些流程呢? 打开word软件,新建一个word文件写入个人简历信息保存文件关闭word软件同样,在操作文件的整体过程与使用word编写一份简历的过程是很相似的 打开文件,或者新建立一个文件读/写数据关闭文件打开文…

2025新年源码免费送

2025很开门很开门的源码免费传递。不需要馒头就能获取4套大开门源码。 听泉偷宝&#xff0c;又进来偷我源码啦&#x1f44a;&#x1f44a;&#x1f44a;。欢迎偷源码 &#x1f525;&#x1f525;&#x1f525; 获取免费源码以及更多源码&#xff0c;可以私信联系我 我们常常…

爬虫基础之爬取某基金网站+数据分析

声明: 本案例仅供学习参考使用&#xff0c;任何不法的活动均与本作者无关 网站:天天基金网(1234567.com.cn) --首批独立基金销售机构-- 东方财富网旗下基金平台! 本案例所需要的模块: 1.requests 2.re(内置) 3.pandas 4.pyecharts 其他均需要 p…