1. 继承于HashMap,定义了新的内部类Entry用于实现双向链表保存记录的插入或访问顺序;
  2. accessOrder用于指示链表保存记录采用的顺序,true为访问顺序,false为插入顺序;
  3. 加入新的记录时需要更新链表,访问记录时需要更新链表(更具accessOrder值判断是否实际更新);
  4. 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 实现总结的更多相关文章

  1. Java学习之LinkedHashMap学习总结

    前言: 在学习LRU算法的时候,看到LruCache源码实现是基于LinkedHashMap,今天学习一下LinkedHashMap的好处以及如何实现lru缓存机制的. 需求背景: LRU这个算法就是 ...

  2. 计算机程序的思维逻辑 (49) - 剖析LinkedHashMap

    之前我们介绍了Map接口的两个实现类HashMap和TreeMap,本节来介绍另一个实现类LinkedHashMap.它是HashMap的子类,但可以保持元素按插入或访问有序,这与TreeMap按键排 ...

  3. Java集合之LinkedHashMap

    一.初识LinkedHashMap 上篇文章讲了HashMap.HashMap是一种非常常见.非常有用的集合,但在多线程情况下使用不当会有线程安全问题. 大多数情况下,只要不涉及线程安全问题,Map基 ...

  4. LinkedHashMap源码阅读笔记(基于jdk1.8)

    LinkedHashMap是HashMap的子类,很多地方都是直接引用HashMap中的方法,所以需要注意的地方并不多.关键的点就是几个重写的方法: 1.Entry是继承与Node类,也就是Linke ...

  5. 图解集合6:LinkedHashMap

    初识LinkedHashMap 上两篇文章讲了HashMap和HashMap在多线程下引发的问题,说明了,HashMap是一种非常常见.非常有用的集合,并且在多线程情况下使用不当会有线程安全问题. 大 ...

  6. 【集合框架】JDK1.8源码分析之LinkedHashMap(二)

    一.前言 前面我们已经分析了HashMap的源码,已经知道了HashMap可以用在哪种场合,如果这样一种情形,我们需要按照元素插入的顺序来访问元素,此时,LinkedHashMap就派上用场了,它保存 ...

  7. 【集合框架】JDK1.8源码分析之HashMap & LinkedHashMap迭代器(三)

    一.前言 在遍历HashMap与LinkedHashMap时,我们通常都会使用到迭代器,而HashMap的迭代器与LinkedHashMap迭代器是如何工作的呢?下面我们来一起分析分析. 二.迭代器继 ...

  8. JDK source 之 LinkedHashMap原理浅谈

    注:本文参考JDK1.7.0_45源码. LinkedHashMap是基于HashMap实现的数据结构,与HashMap主要的不同为每个Entry是使用双向链表实现的,并且提供了根据访问顺序进行排序的 ...

  9. HashMap,LinkedHashMap,TreeMap的区别

    Map主要用于存储健值对,根据键得到值,因此不允许键重复(重复了覆盖了),但允许值重复. Hashmap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很 ...

  10. ArrayList转成HashMap再转成LinkedHashMap 自己的解决方案

    做天津杰超项目中赛事活动作品审核中写的一段代码: //获取全部作品 ActivityProductionQueryCommond productionQueryCommond=new Activity ...

随机推荐

  1. Making a view in a listview invisible android

    问题: I have a ListView that's using a custom adapter. I want to dynamically add/remove items from the ...

  2. 打开package.json 查看node版本并修改本地node版本

  3. [UE4]C++实现动态加载的问题:LoadClass<T>()和LoadObject<T>() 及 静态加载问题:ConstructorHelpers::FClassFinder()和FObjectFinder()

    转自:http://aigo.iteye.com/blog/2281558 动态加载UObject和动态加载UClass分别用LoadObject<T>(),和LoadClass<T ...

  4. SQL按分隔符拆分字段串

    CREATE VIEW [dbo].[Split_BusinessUnit] AS WITH tt AS ( SELECT BusinessUnit.BusinessUnitId , Business ...

  5. (转)CLR20R3 程序终止的几种解决方案

    原文地址:https://blog.csdn.net/fxfeixue/article/details/4466899 这是因为.NET Framework 1.0 和 1.1 这两个版本对许多未处理 ...

  6. Masonry基本语法

    添加约束的方式: 1.通过使用NSLayoutConstraints添加约束到约束数组中,之前必须设置translatesAutoresizingMaskIntoConstraints = NO,即取 ...

  7. 微信小程序--swiper组件

    <view class='swiper-container'> <swiper indicator-dots="true" autoplay=" ver ...

  8. MySQL高可用架构之基于MHA的搭建

    一.MySQL MHA架构介绍: MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Fa ...

  9. Linux性能优化 第六章 性能工具:磁盘I/O

    6.1 磁盘I/O介绍 一般来说,Linux磁盘的每个分区要么包含一个文件系统,要么包含一个交换分区.这些分区被挂载到Linux根文件系统,该系统由/etc/fstab指定.这些被挂载的文件系统包含了 ...

  10. Jscraft 使用 Shell 与预先加载别名混合使用

    Session session = a.getSessionShell("user", "pwd", "host"); Channel ch ...