博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java笔记(2)-LinkedHashMap
阅读量:6220 次
发布时间:2019-06-21

本文共 2727 字,大约阅读时间需要 9 分钟。

hot3.png

LinkedHashMap分析:

/** *  双向链表,用来维护存储的元素顺序,根据accessOrder来判断是存储 * 访问顺序还是插入顺序。 *  因为LinkedHashMap是继承了HashMap,LinkedHashMap其实维护了两组数     * 据,底层是HashMap中的Entry[] table */private transient Entry
header;
/***   true表示按照访问顺序迭代,false时表示按照插入顺序*   默认情况下都是false,只有一个构造方法中提供设置参数*   LRU:Least Recently Used最近最少使用算法 */private final boolean accessOrder;
/*** 可以设置accessOrder的构造方法*/public LinkedHashMap(int initialCapacity, float loadFactor ,boolean accessOrder) {        super(initialCapacity, loadFactor);        this.accessOrder = accessOrder;    }
/***它是在HashMap构造方法中最后被调用的,在HashMap中无意义,专门给继承类*覆盖的。这里初始化了LinkedHashMap的header。**/void init() {    header = new Entry<>(-1, null, null, null);    header.before = header.after = header;}
/***是在resize方法中调用的,LinkedHashMap重写了这个方法,原HashMaph中的transfer遍历table中的每个元素Entry,然后对每个元素再进行遍历得到每一个Entry,重新hash到newTable中。*而LinkedHashMap因为维护了一个header双向链表,只需循环header,提高了迭代效率。*/void transfer(HashMap.Entry[] newTable) {        int newCapacity = newTable.length;        for (Entry
e = header.after; e != header; e = e.after) { int index = indexFor(e.hash, newCapacity); e.next = newTable[index]; newTable[index] = e; } }
/***为了header的双向链表与底层HashMap中的table共同维护,LinkedHashMap覆盖了void addEntry(int hash, K key, V value, int bucketIndex) 和void  createEntry(int hash, K key, V value, int bucketIndex),同时覆盖了类Entry中的void recordAccess(HashMap m)实现header的排序***/void addEntry(int hash, K key, V value, int bucketIndex) {    createEntry(hash, key, value, bucketIndex);    // Remove eldest entry if instructed, else grow capacity if appropriate    Entry
eldest = header.after; if (removeEldestEntry(eldest)) { removeEntryForKey(eldest.key); } else { if (size >= threshold) resize(2 * table.length); }}/***方法默认返回false,提供该方法是为了可以修改为判断是否需要移除最后那个entry,实现比如缓存中将最老的元素移除。*/protected boolean removeEldestEntry(Map.Entry
eldest) { return false; }//同时维护了headervoid createEntry(int hash, K key, V value, int bucketIndex) { HashMap.Entry
old = table[bucketIndex]; Entry
e = new Entry<>(hash, key, value, old); table[bucketIndex] = e; e.addBefore(header); size++;}//插入到header前private void addBefore(Entry
existingEntry) { after = existingEntry; before = existingEntry.before; before.after = this; after.before = this; }//当调用了get或set方法时,此方法被调用用来维护header中元素的顺序。void recordAccess(HashMap
m) { LinkedHashMap
lm = (LinkedHashMap
)m; if (lm.accessOrder) { lm.modCount++; remove(); addBefore(lm.header); } }

转载于:https://my.oschina.net/OpenSourceBO/blog/383930

你可能感兴趣的文章
建造模式
查看>>
程序员如何让自己 Be Cloud Native - 配置篇
查看>>
40.使用JQ对表单进行全面校验
查看>>
飞猪IP-代理-换IP作用
查看>>
爬虫笔记1:Python爬虫常用库
查看>>
linux系统下使用pwgen生成密码的教程
查看>>
java简介
查看>>
斐波那奇数列
查看>>
iOS中的定位
查看>>
amavisd-new 设置
查看>>
我的友情链接
查看>>
第一次修改:pxe无人值守网络安装redhat linux系统脚本
查看>>
开发者必备,超实用的PHP代码片段!
查看>>
doker 1.12-runc源码逻辑跳转流程分析
查看>>
servlet
查看>>
经典(java版)排序算法的分析及实现之二希尔排序
查看>>
Ping延时测试报告:你的WAN链路有多慢
查看>>
linux优化tcp连接
查看>>
Kafka集群扩容遇到的问题
查看>>
mysql小白练手
查看>>