一、概述
之前在学习操作系统的时候,我们学习过一种LRU(Least Recently Used 即最近最少用)内存管理算法,这个算法基于一种假设:长期不被使用的数据,在未来被使用到的几率也不大。因此当数据所占内存达到一定阈值时,我们要移除掉最近被使用的数据。而在LRU算法的实现中,就采用了哈希链表的数据结构。
二、什么是哈希链表
- 首先哈希表是由“key-value”组成的,在逻辑上这些“key-value”是无所谓排列顺序的,而在哈希链表中,每一个Key-Value都有其前驱Key-Value、后继Key-Value,就像双向链表中的节点一样。如下图所示:
三、哈希链表与LRU算法
- 假设我们使用哈希链表来缓存用户信息,当每次访问用户的时候,如果该用户在哈希链表中存在,则更新key对应的用户信息;并将其删除,然后重新插入到哈希链表末端;
- 如果不存在,并且哈希链表的长度没有达到上限,则直接添加在哈希链表的最后一个位置;
- 如果达到上限,就移除哈希链表中的第一个Key-Value,再将其添加到哈希链表末端;
- 每次访问或者更新节点(Key-Value)时,就把该节点删除,并重新添加在哈希链表末端。
四、代码实现:
为了加深对LRU算法的理解,我们可以手写一个哈希链表。
public class MyLinkedHashMap {
private Node head; //头节点
private Node end; //尾节点
//缓存存储上限
private int limit;
private HashMap<String,Node> hashMap;
class Node{
public Node pre; //前节点
public Node next; //后节点
public String key;
public String value;
Node(String key,String value){
this.key=key;
this