zoukankan      html  css  js  c++  java
  • JAVA实现LRU算法

    最近面了阿里的外包吧,居然也要在线敲代码了,那叫一个紧张啊。题目就是实现一个LRU算法的缓存。外包居然要求也这么高了,哎。还好,LRU是我大学老师布置的一道题目,当然我用C语言实现的,算法原理那是一清二楚,可是面试的时候就脑子一片空白了。好在,边敲代码,边思考,就慢慢想起来了,下面是我的代码。仅供参考

    /**
     * 设计和构建一个“最近最少使用”LRU 缓存,该缓存会删除最近最少使用的项目。
     * 缓存应该从键映射到值(允许你插入和检索特定键对应的值),并在初始化时指定最大容量。
     * 当缓存被填满时,它应该删除最近最少使用的项目。
     * 考虑多线程操作下的操作安全和性能。
     */
    public class LRUCache{ private int maxSize; /** * 存储缓存数据 */ private ConcurrentHashMap<String,Object> map = new ConcurrentHashMap<>(); /** **存储缓存key列表 */ private LinkedList<String> list; LRUCache(){ } LRUCache(int maxSize){ this.maxSize = maxSize; this.list = new LinkedList<>(maxSize); } /** * @param key 缓存key @return 缓存值 */ synchronized Object getVal(String key){ //1.从map里取数据 Object obj = map.get(key); //2.将key置于list的尾部(表示最近被访问过了) if(obj != null){ addOrRefreshKey(key); } } synchronized void putVal(String key,Object val){ //1.设置val到map中 //2.将key置于list的尾部(表示最近被访问过了) //3.需要做判断是否list.size()>maxSize。如果满了就删除头部(最近最少使用)的数据后再执行1-2步骤 } /** * 添加或刷新key */ private void addOrRefreshKey(String key){ this.list.remove(key); //管他三七二十一,先删除掉 this.list.add(key); //然后添加这个可以,保证key置于list的尾部 } }
  • 相关阅读:
    MVC模式-----struts2框架(2)
    MVC模式-----struts2框架
    html的<h>标签
    jsp脚本元素
    LeetCode "Paint House"
    LeetCode "Longest Substring with At Most Two Distinct Characters"
    LeetCode "Graph Valid Tree"
    LeetCode "Shortest Word Distance"
    LeetCode "Verify Preorder Sequence in Binary Search Tree"
    LeetCode "Binary Tree Upside Down"
  • 原文地址:https://www.cnblogs.com/hdwang/p/13898966.html
Copyright © 2011-2022 走看看