文档章节

LinkedHashMap浅析

清尘V
 清尘V
发布于 2016/05/08 20:15
字数 325
阅读 9
收藏 0
点赞 2
评论 0

首先明确几点:


  1. LinkedHashMap继承在HashMap,非线程安全的

  2. 数据存储是通过HashMap存储,自身通过链表存储

  3. LinkedHashMap中Entry继承自HashMap的Entry,扩展了两个字段:before和after:实现了数据的有序存储

  4. LinkedHashMap中有一个字段accessOrder,默认是false:按照插入顺序排序,否则按照访问顺序排序,即LRU算

现在看下代码:

 @Override
    void init() {
        header = new Entry<>(-1, null, null, null);
        header.before = header.after = header;
    }

初始化:默认创建一个hash值为-1的Entry,befor和after都是自身引用

void createEntry(int hash, K key, V value, int bucketIndex) {
        HashMap.Entry<K,V> old = table[bucketIndex];
        Entry<K,V> e = new Entry<>(hash, key, value, old);
        table[bucketIndex] = e;
        e.addBefore(header);
        size++;
    }

创建新的Entry:在header之前插入

private void addBefore(Entry<K,V> existingEntry) {
            after  = existingEntry;
            before = existingEntry.before;
            before.after = this;
            after.before = this;
        }

看图简单理解下:






       void recordAccess(HashMap<K,V> m) {
            LinkedHashMap<K,V> lm = (LinkedHashMap<K,V>)m;
            if (lm.accessOrder) {
                lm.modCount++;
                remove();
                addBefore(lm.header);
            }
        }

这个方法会在HashMap的get和put方法调用,那它的作用是:根据accessOrder修改数据存储顺序



  • 如果是访问顺序,即accessOrder是true,那么先把自己从链表删除,然后添加到header之前,由此保证最新访问的在最前面




© 著作权归作者所有

共有 人打赏支持
清尘V
粉丝 43
博文 107
码字总数 47780
作品 0
青岛
程序员
Java集合框架:总结

最近博主对于Java集合框架这个系列做了一个整理,主要包括: Map系:HashMap, LinkedHashMap, TreeMap, WeakHashMap, EnumMap; List系:ArrayList, LinkedList, Vector, Stack; Set系:HashS...

u013256816 ⋅ 2016/03/18 ⋅ 0

hashMap 1.8.0_91 浅析

我对红黑树不是很了解,所以解说不是很好。还有remove等方法没写,以后再说。linkedHashMap,treeMap,也在说 hashMap由数组、链表、红黑树组成。 why? 数组,查找快!只要知道下标,Array...

锦语冰 ⋅ 2016/11/23 ⋅ 0

LinkedHashMap源码笔记

LinkedHashMap介绍 LinkedHashMap继承自HashMap实现Map接口,可以实现有序排列 构造方法 LinkedHashMap的构造方法和HashMap的构造方法都差不多只是每个都加上了 LinkedHashMap 是有序序列acc...

OSC屠夫 ⋅ 2016/09/18 ⋅ 0

LinkedHashMap原理分析

本文主要内容 LinkedHashMap使用 LinkedHashMap源码解析 Lru算法 今天打算看看android的图片缓存相关知识点,没想到引申到了LinkedHashMap容器了。 LinkedHashMap继承HashMap,相比于HashMap...

某昆 ⋅ 06/05 ⋅ 0

LinkedHashMap了解一下

前言 LinkedHashMap类继承图 LinkedHashMap简述 LinkedHashMap的属性 LinkedHashMap的构造函数 LinkedHashMap常见Api解析 总结 前言 本文使用用的是jdk1.8 LinkedHashMap类继承图 我们先来了...

HikariCP ⋅ 05/11 ⋅ 0

Java集合 --- LinkedHashMap底层实现和原理(源码解析)

概述 文章的内容基于JDK1.7进行分析,之所以选用这个版本,是因为1.8的有些类做了改动,增加了阅读的难度,虽然是1.7,但是对于1.8做了重大改动的内容,文章也会进行说明。 LinkedHashMap,见...

起个名忒难 ⋅ 2017/09/24 ⋅ 0

Java集合系列之LinkedHashMap

Java集合系列之LinkedHashMap Hello,大家好,前面给大家讲了HashMap,LinkedList,知道了HashMap为数组+单向链表,LinkedList为双向链表实现的。今天给大家介绍一个(HashMap+"LinkedList")的集...

⋅ 01/03 ⋅ 0

集合源码学习(十一):LinkedHashMap

何为LinkedHashMap LinkedHashMap是一个,具有顺序的HashMap,也就是使用Iterator进行迭代时,顺序与put进来的顺序是一致的。 先看LinkedHashMap的定义: 如上,LinkedHashMap继承自HashMap...

anLA_ ⋅ 2017/10/20 ⋅ 0

重识java-LinkedHashMap

重识java-LinkedHashMap 使用场景 如果需要使用的Map中的key无序,选择;如果要求key有序,则选择。但是选择TreeMap就会有性能问题,因为TreeMap的get操作的时间复杂度是的,相比于HashMap的...

hgfgoodcreate ⋅ 2016/03/09 ⋅ 0

java容器源码分析(七)——LinkedHashMap

本文内容: LinkedHashMap概述 LinkedHashMap源码分析 LinkedHashMap概述 LinkedHashMap类似 于HashMap,区别在于采用迭代器迭代每个元素时,其顺序是按照插入次序或者是LRU次序。 其继承 关...

风水书生 ⋅ 2015/12/18 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

开启Swarm集群以及可视化管理

在搭建的两台coreos服务器上开启swarm集群 前置条件: docker均开启2375端口 同一个局域网内 主服务器上安装Portainer容器 安装Portainer容器执行: docker run -d -p 9000:9000 --restart=a...

ykbj ⋅ 16分钟前 ⋅ 0

单例设计模式

1、单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例 2、饿汉式单例类 在这个类被加载时,静态变量instance会被初始化,此时类的私有构造子会被调用 饿汉式是典型...

职业搬砖20年 ⋅ 21分钟前 ⋅ 0

前端基础(四):前端国际规范收集

字数:1142 阅读时间:5分钟 前言 由于前端技术的灵活性和杂乱性,导致网上的许多解决方案不够全面甚至是完全错误,容易起到误导作用。所以,我对搜索到的解决方案往往是存疑态度。那么,如何...

老司机带你撸代码 ⋅ 23分钟前 ⋅ 0

Failed to open/create Network-VirtualBox Host-Only

虚拟机版本 : Oracle Vm VirtualBox 5.2.12 报错时机:开网卡二,重启虚拟机报错 "Failed to open/create the internal network 'HostInterfaceNetworking-VirtualBox Host-Only Ethernet Ada......

p至尊宝 ⋅ 26分钟前 ⋅ 0

三分钟学会如何在函数计算中使用 puppeteer

摘要: 使用 puppeteer 结合函数计算,可以快速的构建弹性的服务完成各种功能,包括:生成网页截图或者 PDF、高级爬虫,可以爬取大量异步渲染内容的网页、模拟键盘输入、表单自动提交、登录网...

阿里云云栖社区 ⋅ 29分钟前 ⋅ 0

springMVC接收表单时 Bean对象有Double Int Char类型的处理

前台ajax提交表单price为double类型 后台controller就介绍不到 400错误 前台 实体类: public class ReleaseMapIconConfig{ private String id; private long maxValue; private long minVal......

废柴 ⋅ 32分钟前 ⋅ 0

ZOOKEEPER安装

工作需要在ubuntu上配置了一个zookeeper集群,有些问题记录下来。 1. zookeeper以来java,所以首先要安装java。但是ubuntu系统有自带的jdk,需要通过命令切换java版本: $ sudo update-alter...

恰东 ⋅ 35分钟前 ⋅ 0

linux 进程地址空间的一步步探究

我们知道,在32位机器上linux操作系统中的进程的地址空间大小是4G,其中0-3G是用户空间,3G-4G是内核空间。其实,这个4G的地址空间是不存在的,也就是我们所说的虚拟内存空间。 那虚拟内存空间...

HelloRookie ⋅ 35分钟前 ⋅ 0

myatis #{}与${}区别及原理

https://blog.csdn.net/wo541075754/article/details/54292751

李道福 ⋅ 38分钟前 ⋅ 0

三分钟学会如何在函数计算中使用 puppeteer

摘要: 使用 puppeteer 结合函数计算,可以快速的构建弹性的服务完成各种功能,包括:生成网页截图或者 PDF、高级爬虫,可以爬取大量异步渲染内容的网页、模拟键盘输入、表单自动提交、登录网...

猫耳m ⋅ 39分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部