LinkedHashMap 实现总结
- 继承于HashMap,定义了新的内部类Entry用于实现双向链表保存记录的插入或访问顺序;
- accessOrder用于指示链表保存记录采用的顺序,true为访问顺序,false为插入顺序;
- 加入新的记录时需要更新链表,访问记录时需要更新链表(更具accessOrder值判断是否实际更新);
- removeEldestEntry方法在LinkedHashMap用于表示缓存时有用,通过重载该方法(修改更新链表的逻辑以及返回值),删除有限容量下缓存中的最旧记录;
public class MyLinkedHashMap<K, V> extends MyHashMap<K, V> {
private boolean accessOrder; private Entry<K, V> header; public V get(K k) {
Entry<K, V> e = (Entry<K, V>) getEntry(k);
if (e == null) {
return null;
}
e.recordAccess(this);
return e.value;
} @Override
void addEntry(K k, V v, int index) {
MyHashMap.Entry<K, V> old = table[index];
Entry<K, V> e = new Entry<K, V>(k, v, old);
table[index] = e;
e.addBefore(header);
size++;
Entry<K, V> eldest = header.after;
/**
* 如果用於表示LRU算法的缓存,需覆盖removeEldestEntry,删除最旧条目同时返回true
*/
if (removeEldestEntry(eldest)) {
removeEntryForKey(eldest.key);
} else {
if (size >= threshold) {
resize(2 * table.length);
}
}
} boolean removeEldestEntry(Entry<K, V> e) {
return false;
} private static class Entry<K, V> extends MyHashMap.Entry<K, V> {
Entry<K, V> before, after; public Entry(K k, V v, MyHashMap.Entry<K, V> n) {
super(k, v, n);
// TODO Auto-generated constructor stub
} private void remove() {
before.after = after;
after.before = before;
} private void addBefore(Entry<K, V> existingEntry) {
after = existingEntry;
before = existingEntry.before;
after.before = this;
before.after = this;
} void recordAccess(MyHashMap<K, V> m) {
MyLinkedHashMap<K, V> lm = (MyLinkedHashMap<K, V>) m;
if (lm.accessOrder) {
remove();
addBefore(lm.header);
}
} } }
LinkedHashMap 实现总结的更多相关文章
- Java学习之LinkedHashMap学习总结
前言: 在学习LRU算法的时候,看到LruCache源码实现是基于LinkedHashMap,今天学习一下LinkedHashMap的好处以及如何实现lru缓存机制的. 需求背景: LRU这个算法就是 ...
- 计算机程序的思维逻辑 (49) - 剖析LinkedHashMap
之前我们介绍了Map接口的两个实现类HashMap和TreeMap,本节来介绍另一个实现类LinkedHashMap.它是HashMap的子类,但可以保持元素按插入或访问有序,这与TreeMap按键排 ...
- Java集合之LinkedHashMap
一.初识LinkedHashMap 上篇文章讲了HashMap.HashMap是一种非常常见.非常有用的集合,但在多线程情况下使用不当会有线程安全问题. 大多数情况下,只要不涉及线程安全问题,Map基 ...
- LinkedHashMap源码阅读笔记(基于jdk1.8)
LinkedHashMap是HashMap的子类,很多地方都是直接引用HashMap中的方法,所以需要注意的地方并不多.关键的点就是几个重写的方法: 1.Entry是继承与Node类,也就是Linke ...
- 图解集合6:LinkedHashMap
初识LinkedHashMap 上两篇文章讲了HashMap和HashMap在多线程下引发的问题,说明了,HashMap是一种非常常见.非常有用的集合,并且在多线程情况下使用不当会有线程安全问题. 大 ...
- 【集合框架】JDK1.8源码分析之LinkedHashMap(二)
一.前言 前面我们已经分析了HashMap的源码,已经知道了HashMap可以用在哪种场合,如果这样一种情形,我们需要按照元素插入的顺序来访问元素,此时,LinkedHashMap就派上用场了,它保存 ...
- 【集合框架】JDK1.8源码分析之HashMap & LinkedHashMap迭代器(三)
一.前言 在遍历HashMap与LinkedHashMap时,我们通常都会使用到迭代器,而HashMap的迭代器与LinkedHashMap迭代器是如何工作的呢?下面我们来一起分析分析. 二.迭代器继 ...
- JDK source 之 LinkedHashMap原理浅谈
注:本文参考JDK1.7.0_45源码. LinkedHashMap是基于HashMap实现的数据结构,与HashMap主要的不同为每个Entry是使用双向链表实现的,并且提供了根据访问顺序进行排序的 ...
- HashMap,LinkedHashMap,TreeMap的区别
Map主要用于存储健值对,根据键得到值,因此不允许键重复(重复了覆盖了),但允许值重复. Hashmap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很 ...
- ArrayList转成HashMap再转成LinkedHashMap 自己的解决方案
做天津杰超项目中赛事活动作品审核中写的一段代码: //获取全部作品 ActivityProductionQueryCommond productionQueryCommond=new Activity ...
随机推荐
- C#连接数据库最基本操作之sql语句 DML
C#连接数据库最基本操作之sql语句 DML //1 连接字符串 string connectionString = "server=127.0.0.1;integrated securit ...
- golang 入门之struct继承,嵌套
package main import "fmt" type Jocongmin struct{ Name string Home string Want string } fun ...
- Service 和 IntentService的区别;
Srevice不是在子线程,在Srevice中做耗时操作一样ANR,然后我们就会用到IntentService,IntentSrevice不但擅长做耗时操作,还有一个特点,用完即走: 在Srevice ...
- JQuery加载列表实现动画滚动(自上而下挤)
这个例子是jquery动态加载列表,并通过定时刷新,实现其循环滚动效果的一个例子. 1.HTML代码: <div class="fake-table"> <li ...
- DRF 视图组件,路由组件
视图组件 -- 第一次封装 -- GenericAPIView(APIView): queryset = None serializer_class = None def ge ...
- mysql查询当前时间,一天内,一周,一个月内的sql语句
查询一天:select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天 SELECT * FROM 表名 WHERE TO_DAYS( NOW( ...
- 了解Python内存管理机制,让你的程序飞起来
引用: 语言的内存管理是语言设计的一个重要方面.它是决定语言性能的重要因素.无论是C语言的手工管理,还是Java的垃圾回收,都成为语言最重要的特征.这里以Python语言为例子,说明一门动态类型的.面 ...
- elasticssearch+kibanna入门(撰写中)
看到一篇elasticssearch+kibanna的文章,觉得很好,不过例子是python的,所以使用java自己安装一下: https://mp.weixin.qq.com/s?__biz=MjM ...
- fabric默认样例的分析
参考资料 http://www.bubuko.com/infodetail-2092748.html http://www.ithao123.cn/content-11117437.html http ...
- 分布式计算课程补充笔记 part 1
▶ 高性能计算机发展历程 真空管电子计算机,向量机(Vector Machine),并行向量处理机(Parallel Vector Processors,PVP),分布式并行机(Parallel Pr ...