java基于Hash表和双向链表简单实现LRU Cache

package lru;

import java.util.HashMap;

public class LRUCache2<K,V> {
    public final int capacity;
    class DNode{
        K key;
        V value;
        DNode next;
        DNode pre;
        public DNode(K key, V value, LRUCache2<K, V>.DNode pre, LRUCache2<K, V>.DNode next) {
            super();
            this.key = key;
            this.value = value;
            this.pre = pre;
            this.next = next;
        }

    }
      //附加头结点
    DNode head=new DNode(null,null,null,null);
    DNode last=head;

    HashMap<K,DNode> map=new HashMap<>();

    public LRUCache2(int capacity) {
        this.capacity=capacity;
    }

    public V get(K key) {
        DNode node=map.get(key);
        if(node!=null) {
            moveToHead(node);
        }
        return node==null?null:node.value;
    }

    public void put(K key, V value) {
        DNode node=map.get(key);
        if(node==null) {
            if(map.size()>=capacity) {
                removeLast();
            }
            node=new DNode(key, value,head,head.next);
            if(head.next!=null)
                head.next.pre=node;
            head.next=node;
            map.put(node.key, node);
            if(last==head) last=node;
        }else {
            node.value=value;
            moveToHead(node);
        }

    }
    private void removeLast() {
        // TODO Auto-generated method stub
        if(last==null) {
            throw new IllegalArgumentException("cant remove before put");
        }
        map.remove(last.key);
        last.pre.next=null;
        last=last.pre;
    }

    private void moveToHead(LRUCache2<K, V>.DNode node) {
        // TODO Auto-generated method stub
        if(head.next==node) return;
        if(last==node) {
            last=node.pre;
        }
        node.pre.next=node.next;
        if(node.next!=null) node.next.pre=node.pre;
        node.next=head.next;
        node.pre=head;
        head.next.pre=node;
        head.next=node;
    }
}

原文地址:https://www.cnblogs.com/lshao/p/9650673.html

时间: 2024-10-31 03:13:01

java基于Hash表和双向链表简单实现LRU Cache的相关文章

为什么Java的hash表的长度一直是2的指数次幂?为什么这个(hash&amp;(h-1)=hash%h)位运算公式等价于取余运算?

1.什么是hash表? 答:简单回答散列表,运算在hash结构散列(分散)存放. 2.如何散列排布,如果均匀排布? 答:取余运算 3.Java中如何实现? 答:hash&(h-1) 4.为什么hash&(h-1)=等价于hash%h java的h(表长)一定是2的指数次幂,2的指数次幂2n 2n的结果:一定长这样10000...(n个0) 2n-1的结果:一定这样1111(n-1)个1 举个例子: 当h=16,对应的二进制:00010000 h-1=15,对应的二进制:00001111 可

LeetCode 之 LRU Cache Java实现

LeetCode刷了41道题了,流程是按照戴兄的小书,很多不会的是参考Kim姐的代码,自己用Java抠腚的. 前几天做到了LRU Cache: C++的实现方法大同小异,大都用的是一个list加一个hash,hash中存储list节点地址,每次get从hash中寻key,有则将list相应节点放到链表头,没有则返回-1:每次set先判断hash中是否存在,存在则将相应节点移到表头,重置value值,如果不存在,判定长度是否达到预设的capacity,如果达到,删除表尾节点,新节点插入表头. 但是

【线性表基础】基于线性表的简单算法【Java版】

本文描述了基于线性表的简单算法及其代码[Java实现] 1-1 删除单链表中所有重复元素 // Example 1-1 删除单链表中所有重复元素 private static void removeRepeat(LinkList L) { Node node = L.head.next; // 首结点 while (node != null) // 一重循环,遍历L中的每一个元素 { // Object data=p.data; Node p = node; // q结点的前驱 Node q =

C++模板实现动态顺序表(更深层次的深浅拷贝)与基于顺序表的简单栈的实现

前面介绍的模板有关知识大部分都是用顺序表来举例的,现在我们就专门用模板来实现顺序表,其中的很多操作都和之前没有多大区别,只是有几个比较重要的知识点需要做专门的详解. 1 #pragma once 2 #include<iostream> 3 #include<string> 4 #include<stdlib.h> 5 using namespace std; 6 7 template <class T> 8 class Vector 9 { 10 publ

java基于MVC的简单博客系统

原文:java基于MVC的简单博客系统 源代码下载地址:http://www.zuidaima.com/share/1550463595760640.htm 采用技术:jsp+servlie+javaBean+mysql+ajax

【连载】关系型数据库是如何工作的?(6) - Hash表

最后我们介绍的重要数据结构就是Hash表.当你需要快速查找的时候非常有用,而且理解Hash表会有助于我们以后理解常用数据库Join方式之一Hash join.这种数据结构常被数据库用作存储内部数据结构:表锁或缓存池(后续章节会介绍). Hash表能够通过元素Key快速找到元素的,为了构建一张Hash表,你需要定义: 一个元素的Key: 一个关于Key的Hash函数,Key的hash值就代表元素所在的位置(我们通常称为Hash桶): 一个关于Key的比较函数,一旦你找到了正确的桶,你就可以通过比较

Java集合--Hash、Hash冲突

一.Hash 散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在内存存储位置的数据结构.也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度. 这个映射函数称做散列函数,存放记录的数组称做散列表. 实现Hash算法的关键:实现hash算法 .解决hash冲突 1.Hash函数 首先来说hash函数,java中对象都已一个hashCode()方法,那为什么还需要hash函数呢?hashCode是在jdk中是有符号int类型,

十一、从头到尾彻底解析Hash 表算法

在研究MonetDB时深入的学习了hash算法,看了作者的文章很有感触,所以转发,希望能够使更多人受益! 十一.从头到尾彻底解析Hash 表算法 作者:July.wuliming.pkuoliver  出处:http://blog.csdn.net/v_JULY_v.  说明:本文分为三部分内容,    第一部分为一道百度面试题Top K算法的详解:第二部分为关于Hash表算法的详细阐述:第三部分为打造一个最快的Hash表算法.----------------------------------

Hash表算法

出处:http://blog.csdn.net/v_JULY_v 第一部分:Top K 算法详解问题描述百度面试题:    搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节.    假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个.一个查询串的重复度越高,说明查询它的用户越多,也就是越热门.),请你统计最热门的10个查询串,要求使用的内存不能超过1G. 必备知识:    什么是哈希表?    哈希