文档章节

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

清尘V

粉丝 41
博文 107
码字总数 47780
作品 0
青岛
程序员
私信 提问
LinkedHashMap源码浅析jdk1.7

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

kin1492
2018/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
浅析LRUCache原理(Android)

一. LruCache基本原理 LRU全称为Least Recently Used,即最近最少使用。 由于缓存容量是有限的,当有新的数据需要加入缓存,但缓存的空闲空间不足的时候,如何移除原有的部分数据从而释放空间...

天王盖地虎626
06/17
49
0
hashMap 1.8.0_91 浅析

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

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

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

OSC屠夫
2016/09/18
42
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring Cloud 笔记之Spring cloud config client

观察者模式它的数据的变化是被动的。 观察者模式在java中的实现: package com.hxq.springcloud.springcloudconfigclient;import org.springframework.context.ApplicationListener;i...

xiaoxiao_go
44分钟前
4
0
CentOS7.6中安装使用fcitx框架

内容目录 一、为什么要使用fcitx?二、安装fcitx框架三、安装搜狗输入法 一、为什么要使用fcitx? Gnome3桌面自带的输入法框架为ibus,而在使用ibus时会时不时出现卡顿无法输入的现象。 搜狗和...

技术训练营
今天
4
0
《Designing.Data-Intensive.Applications》笔记 四

第九章 一致性与共识 分布式系统最重要的的抽象之一是共识(consensus):让所有的节点对某件事达成一致。 最终一致性(eventual consistency)只提供较弱的保证,需要探索更高的一致性保证(stro...

丰田破产标志
今天
7
0
docker 使用mysql

1, 进入容器 比如 myslq1 里面进行操作 docker exec -it mysql1 /bin/bash 2. 退出 容器 交互: exit 3. mysql 启动在容器里面,并且 可以本地连接mysql docker run --name mysql1 --env MY...

之渊
今天
7
0
python数据结构

1、字符串及其方法(案例来自Python-100-Days) def main(): str1 = 'hello, world!' # 通过len函数计算字符串的长度 print(len(str1)) # 13 # 获得字符串首字母大写的...

huijue
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部