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#day02
using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace testmys ...
- C# DataReader
//1 连接字符串 string connectionString = "server=127.0.0.1;integrated security=true;database=MSPetSh ...
- windows gitbook pdf
1.安装 nodejs 下载地址:https://nodejs.org/download/release/v6.9.2/node-v6.9.2-x64.msi 执行安装 配置环境变量:C:\Progr ...
- Android Studio设置自定义字体
Android Studio设置自定义字体 (1)进入设置页面,File->Settings (2)自定义字体Editor->Colors&Fonts->Font (3)点击 ...
- AndroidStudio查看无用的资源文件;
1.打开需要查看的项目,选择AS上方标题栏的Analyze选项: 2.选择 Run Inspection by Name 3.在弹出框内输入 unused resources 4.筛选你需要查看的资源 ...
- RPM软件管理工具
1 概述 RPM(RedHat Package Manager),Rethat软件包管理工具,类似windows里面的setup.exe 是Linux这系列操作系统里面的打包安装工具,它虽然是RedH ...
- 10.纯 CSS 创作一个同心圆弧旋转 loader 特效
原文地址:https://segmentfault.com/a/1190000014682999 想到了扇形:正方形 ->border-radius: 50%; ->取四份中的任意一份. ...
- 《汇编语言 基于x86处理器》第十章 - 运行一个 16位实地址汇编程序
▶ 书上第 10 章,主要讲了宏,引用了一个 16 位实地址的程序,从代码开始到运行 ● 代码 ; main.asm INCLUDE Macros.inc IF IsDefined( RealMode ...
- openx -书表添加字段
OpenX的版本是2.8.10.在数据表加完数据库之后,还不能读取和保存字段. OpenX使用scheme来 管理数据库表和字段, 修改数据库结构同时也要修改相关schema, 一个是etc/tabl ...
- spring 之 factory-bean & factory-method
这两者常常是一起出现的,或者说他们经常是一起被使用的.但是其实是分为了两种情况: 1 同时使用factory-bean 和 factory-method 如果,我们在一个bean 元素上同时配置 fa ...