LinkedHashMap部分底层源码解析

news2024/11/23 16:37:29

JDK版本为1.8.0_271,LinkedHashMap继承了HashMap,LinkedHashMap在HashMap的基础上维护了一个双向链表,实现了可以根据插入顺序/访问顺序(accessOrder=false/true)访问Map集合。
关于HashMap的原理可以参考HashMap部分底层源码解析
部分属性:

    /**
     * 双向链表头节点
     */
    transient LinkedHashMap.Entry<K,V> head;

    /**
     * 双向链表尾节点
     */
    transient LinkedHashMap.Entry<K,V> tail;

    /**
     * 默认为accessOrder=false,表示按照插入顺序迭代
     * accessOrder=true,表示按照访问顺序迭代
     */
    final boolean accessOrder;

内部定义的Entry如下:

static class Entry<K,V> extends HashMap.Node<K,V> {
	Entry<K,V> before, after;	// Node节点的前后指针
	Entry(int hash, K key, V value, Node<K,V> next) {
		super(hash, key, value, next);
	}
}

LinkedHashMap重写了HashMap中的newNode()方法:

Node<K,V> newNode(int hash, K key, V value, Node<K,V> e) {    
    LinkedHashMap.Entry<K,V> p =        new LinkedHashMap.Entry<K,V>(hash, key, value, e);    
    // 新增的键值对p也要尾插法挂到双向链表  
    linkNodeLast(p);    
    return p;
}
TreeNode<K,V> newTreeNode(int hash, K key, V value, Node<K,V> next) {
    TreeNode<K,V> p = new TreeNode<K,V>(hash, key, value, next);
    linkNodeLast(p);  // 新增的键值对p也要尾插法挂到双向链表  
    return p;
}

// 键值对p要尾插法挂到双向链表
private void linkNodeLast(LinkedHashMap.Entry<K,V> p) {
    LinkedHashMap.Entry<K,V> last = tail;
    tail = p;
    // 尾插法挂载节点到双向链表
    if (last == null)
        head = p;
    else {
        p.before = last;
        last.after = p;
    }
}
8.4.2 图示

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1589195.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IOPaint部署,实现去水印效果

下载源代码 https://github.com/Sanster/IOPaint https://github.com/advimman/lama 创建虚拟环境 conda create --prefixD:\CondaEnvs\iopaint python3.10 conda activate D:\CondaEnvs\iopaint安装依赖包 pytorch最低2.0.0 # 查看cuda版本安装对应的pytorch nvcc -V # …

Prototype 原型

意图 用原型实例指定创建对象的种类&#xff0c;并且通过复制这些原型创建新的对象。 结构 Prototype声明一个复制自身的接口。ConcretePrototype实现一个复制自身的操作。Client让一个原型复制自身从而创建一个新的对象。 适用性 当一个系统应该独立于他的产品创建、构成和…

HashMap的常见问题

Entry中的hash属性为什么不直接使用key的hashCode()返回值呢&#xff1f; 不管是JDK1.7还是JDK1.8中&#xff0c;都不是直接用key的hashCode值直接与table.length-1计算求下标的&#xff0c;而是先对key的hashCode值进行了一个运算&#xff0c;JDK1.7和JDK1.8关于hash()的实现…

如何卸载干净 IDEA(图文讲解)

更新时间 2022-12-20 11:一则或许对你有用的小广告 星球 内第一个项目&#xff1a;全栈前后端分离博客项目&#xff0c;演示地址&#xff1a;Weblog 前后端分离博客, 1.0 版本已经更新完毕&#xff0c;正在更新 2.0 版本。采用技术栈 Spring Boot Mybatis Plus Vue 3.x Vit…

lanqiao.602 迷宫

题目&#xff1a; 代码&#xff1a; #include<iostream> #include<cstring> #include<algorithm> #include<queue> using namespace std; char mp[31][51]; //稍微开大一点 char k[4]{D,L,R,U}; //按字典序记录路径 int dirx[]{1,0,0,-1},d…

给picgo上传的图片加个水印

之前给大家介绍了picgo和免费的图床神器。我们本可以开开心心的进行markdown写作了。 但是总是会有那么一些爬虫网站过来爬你的文章&#xff0c;还把你的文章标明是他们的原著。咋办呢&#xff1f;这里有一个好的办法就是把markdown中上传的图片加上自己的水印不就行了。 说干…

【复现】CVE-2024-29269 某国外路由器RCE漏洞_72

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 在 Telesquare TLR-2005Ksh 1.0.0 和 1.1.4 中发现的一个问题允许攻击者通过 Cmd 参数运行任意系统命令。 二 .漏洞影响 通过提交…

C语言---顺序表(二)

文章目录 前言1.准备工作2.代码的实现2.1.顺序表的创建、销毁和打印2.2.顺序表的扩容、头插\删、尾插\删2.2.1.扩容2.2.2.尾插2.2.3.头插2.2.3.尾删2.2.4.头删 2.3.指定位置之前插入/删除数据/查找数据2.3.1.指定位置之前插入数据2.3.2.指定位置之前删除数据2.3.3.查找特定数据…

vue3 依赖-组件tablepage-vue3说明文档,列表页快速开发,使用思路及范例(Ⅰ)配置项文档

vue3 依赖-组件tablepage-vue3说明文档&#xff0c;列表页快速开发&#xff0c;使用思路及范例&#xff08;Ⅰ&#xff09;配置项文档 vue3 依赖-组件tablepage-vue3说明文档&#xff0c;列表页快速开发&#xff0c;使用思路及范例&#xff08;Ⅱ&#xff09;搜索及数据获取配…

Linux-select剖析

一、select函数 select函数是IO多路复用的函数&#xff0c;它主要的功能是用来等文件描述符中的事件是否就绪&#xff0c;select可以使我们在同时等待多个文件缓冲区 &#xff0c;减少IO等待的时间&#xff0c;能够提高进程的IO效率。 select()函数允许程序监视多个文件描述符…

旋转编码器原理(超简单)

波形图 A相和B相的状态变化与旋转方向有关。当顺时针旋转时&#xff0c;A相引脚会先变化&#xff0c;然后是B相引脚。而逆时针旋转时&#xff0c;B相引脚会先变化&#xff0c;然后是A相引脚 这是两个引脚的实际波形采样&#xff0c;越密集的旋转的越快 可以发现特点&#xff0…

Redis从入门到精通(十四)Redis分布式缓存(二)Redis哨兵集群的搭建和原理分析

文章目录 前言5.3 Redis哨兵5.3.1 哨兵原理5.3.1.1 集群的结构和作用5.3.1.2 集群监控原理5.3.1.3 集群故障恢复原理 5.3.2 搭建哨兵集群5.3.3 RedisTemplate5.3.3.1 搭建测试项目5.3.3.2 场景测试 前言 Redis分布式缓存系列文章&#xff1a; Redis从入门到精通(十三)Redis分…

Git分布式版本控制系统——Git常用命令(二)

五、Git常用命令————分支操作 同一个仓库可以有多个分支&#xff0c;各个分支相互独立&#xff0c;互不干扰 分支的相关命令&#xff0c;具体如下&#xff1a; git branch 查看分支 git branch [name] 创建分支&#x…

面试题:重写equals(),为什么还要重写hashcode()

认识equals(): Object类中的equals; public boolean equals(Object obj) {return (this obj);}当我们没有重写equals&#xff08;&#xff09;&#xff0c;我们是调用父类object中的方法&#xff0c;比较的是对象的内存地址 重写equals后&#xff0c; public class Student…

蓝桥杯嵌入式(G431)备赛笔记——DMA+UART

目录 CubeMX配置&#xff1a; 代码配置: DMA通道接收&#xff1a; DMA通道发送&#xff1a; 注意&#xff1a; 主函数中记得开启串口接收回调函数&#xff1a; 加了DMA的UART接收通道和一般的区别&#xff1a; 加了DMA的UART发送和一般的区别&#xff1a; CubeMX配置&…

Day23_学点儿Java_多态复习

1 做错的选择题 Java中的多态性是通过以下哪个机制实现的&#xff1f;&#xff08;&#xff09; A. 方法重载 B. 方法覆盖 C. 抽象类 D. 接口2 多态复习 2.1 学点儿Java_Day7_继承、重载、重写、多态、抽象类 2.2 面向对象四大基本特征 封装、抽象、继承、多态 封装 面向…

【翻译】再见, Clean Code!

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 【翻译】再见, Clean Code!正文那是一个深夜次日早晨这只是一个阶段 【翻译】再见…

CTF-SHOW SSRF

web351 存在一个flag.php页面&#xff0c;访问会返回不是本地用户的消息&#xff0c;那肯定是要让我们以本地用户去访问127.0.0.1/flag.php web352 代码中先判断是否为HTTP或https协议&#xff0c;之后判断我们传入的url中是否含有localhost和127.0.0&#xff0c;如果没有则…

JAVA集合ArrayList

目录 ArrayList概述 add(element) 用法 add(index, element)用法 remove&#xff08;element&#xff09;用法 remove&#xff08;index&#xff09;用法 get(index)用法 set(index,element) 练习 test1 定义一个集合&#xff0c;添加字符串&#xff0c;并进行遍历&…

【JavaWeb】Day42.MySQL概述——多表查询

介绍 多表查询&#xff1a;查询时从多张表中获取所需数据 单表查询的SQL语句&#xff1a;select 字段列表 from 表名; 如果要执行多表查询&#xff0c;只需要使用逗号分隔多张表即可&#xff0c;如&#xff1a; select 字段列表 from 表1, 表2; 例如&#xff1a;查询…