文档章节

LinkedHashMap浅析

清尘V
 清尘V
发布于 2016/05/08 20:15
字数 325
阅读 11
收藏 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之前,由此保证最新访问的在最前面




© 著作权归作者所有

共有 人打赏支持
上一篇: LinkedList浅析
下一篇: 命令模式
清尘V
粉丝 41
博文 107
码字总数 47780
作品 0
青岛
程序员
私信 提问
LinkedHashMap源码浅析jdk1.7

LinkedHahsMap的继承关系 LinkedHashMap直接继承了HahsMap,而linkedHashMap和HashMap在同一个包下,因此HashMap中所有的非private的属性都能拿过来直接用。 LinkedHashMap继承HashMap原来的...

kin1492
07/24
0
0
Java集合框架:总结

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

u013256816
2016/03/18
0
0
hashMap 1.8.0_91 浅析

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

锦语冰
2016/11/23
2
0
LinkedHashMap源码笔记

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

OSC屠夫
2016/09/18
26
0
LinkedHashMap了解一下

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

HikariCP
05/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周三乱弹 —— 有一天考拉麻麻拉肚子了

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @瘟神灬念 :分享周汇洋的单曲《Man Srae(曼斯拉之舞)》:美滋滋。。。。 手机党少年们想听歌,请使劲儿戳(这里) 我听了一下 赶紧关了, ...

小小编辑
40分钟前
12
3
oh-my-zsh 自定义

GitHub 地址 基于 oh-my-zsh 的自定义配置,增加了一些个人常用插件与皮肤。 采用的是 git submodule 来维护,包括 oh-my-zsh,之所以这么搞,主要是手头有多台 linux 需要维护, 每台机器、...

郁也风
今天
6
0
Docker安装踩坑:E_FAIL 0x80004005的解决

参考 菜鸟教程--Windows Docker 安装 http://www.runoob.com/docker/windows-docker-install.html 官方文档-Install Docker Toolbox on Windows https://docs.docker.com/toolbox/toolbox_in......

karma123
今天
6
0
js垃圾回收机制和引起内存泄漏的操作

JS的垃圾回收机制了解吗? Js具有自动垃圾回收机制。垃圾收集器会按照固定的时间间隔周期性的执行。 JS中最常见的垃圾回收方式是标记清除。 工作原理:是当变量进入环境时,将这个变量标记为“...

Jack088
昨天
18
0
大数据教程(10.1)倒排索引建立

前面博主介绍了sql中join功能的大数据实现,本节将继续为小伙伴们分享倒排索引的建立。 一、需求 在很多项目中,我们需要对我们的文档建立索引(如:论坛帖子);我们需要记录某个词在各个文...

em_aaron
昨天
27
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部