`

一个LRUCache实现

    博客分类:
  • java
 
阅读更多

我写的一个LRUCache的实现

import java.util.Hashtable;


public class LRUCache {
    class CacheNode {
        CacheNode prev;
        CacheNode next;
        Object key;
        Object value;
    }

    private int cacheSize;
    private int currentSize;
    private Hashtable<Object,CacheNode> nodes;
    private CacheNode first;
    private CacheNode last;

    public LRUCache(){}

    public LRUCache(int size){
        this.cacheSize = size;
        this.nodes = new Hashtable<Object,CacheNode>(size);
        this.currentSize = 0;
    }

    public void moveToHead(CacheNode node){
        if(first == node){
            return;
        }
        if(node.prev != null){
            node.prev = node.prev.next;
        }

        if(node.next != null){
            node.next.prev = node.prev;
        }

        if(last == node){
            last = node.prev;
        }

        if(first != null){
            first.prev = node;
            node.next = first;
        }

        first = node;
        node.prev = null;
        if(last == null){
            last = first;
        }
    }

    public void removeLast(){
        if(last != null){
            if(last.prev != null){
                last.prev.next = null;
            } else {
                first = null;
            }
            last = last.prev;
            nodes.remove(last.key);
            currentSize--;
        }
    }

    public void put(Object key, Object value){
        CacheNode node = nodes.get(key);
        if(node == null){
            if(currentSize >= cacheSize){
                if(last != null){
                    nodes.remove(key);
                }
                removeLast();
            } else {
                currentSize++;
            }
            node = new CacheNode();
        }
        node.key = key;
        node.value = value;
        moveToHead(node);
        nodes.put(key, node);
    }

    public Object get(Object key){
        CacheNode node = nodes.get(key);
        if(node != null){
            moveToHead(node);
            return node.value ;
        }
        return null;
    }

    public Object remove(Object key){
        CacheNode node = nodes.get(key);
        if(node != null){
            if(node.prev != null){
                node.prev.next = node.next;
            } else {
                first = null;
            }

            if(node.next != null){
                node.next.prev = node.prev;
            }

            if(first == node){
                first = node.next;
            }

            if(last == node){
                last = node.prev;
            }

            nodes.remove(key);
            currentSize--;
            return node.value;
        }
        return null;
    }
}

分享到:
评论

相关推荐

    LRUCache实现 同步LRUCache

    下面是一个简单的LRUCache实现示例: ```java import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; public class LRUCache, V&gt; extends LinkedHashMap, V&gt; { private final int ...

    LruCache实现图片缓存

    它内部维护了一个双向链表和一个哈希表,新加入的元素会被添加到链表头部,每次访问一个元素,该元素都会被移动到链表头部。当缓存满时,新的元素将替换掉链表尾部的元素,即最近最少使用的元素。 下面是如何在...

    FrameAnimation帧动画以及LruCache优化的自定动画

    LruCache(Least Recently Used Cache)是Android提供的一个基于最近最少使用原则的内存缓存机制。在内存不足时,它会自动删除最近最少使用的数据。在帧动画中,我们可以将每一帧的Bitmap存储在LruCache中,避免重复...

    android图片下载LruCache实现三级缓存方式

    "android图片下载LruCache实现三级缓存方式"是一个典型的图片加载优化实践,它涉及到内存缓存、外部存储(如SD卡)缓存以及网络缓存三个层次。下面我们将详细探讨这一技术。 首先,LruCache是Android SDK提供的一种...

    AndroidStudio利用DiskLruCache和LruCache实现简单的照片墙

    AndroidStudio利用DiskLruCache和LruCache实现简单的照片墙

    利用DiskLruCache和LruCache实现简单的照片墙--demo

    本示例项目"利用DiskLruCache和LruCache实现简单的照片墙--demo"正是针对这一需求,通过在磁盘和内存中进行缓存管理,确保用户即使在网络不畅的情况下也能流畅地查看之前加载过的照片。 首先,我们来详细了解一下这...

    简易单链表实现,附带LruCache算法的增删改查

    简易单链表增删改查功能实现。新增内容:新增单链表LruCache算法增删改查,对学习LruCache 算法有一定帮助。

    LruCache/DiskLruCache实现照片墙

    1. **使用方法**:首先,你需要根据应用程序的需求计算出可用的最大内存,然后创建一个LruCache实例,其大小为最大内存的1/8。例如: ```java int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024); ...

    LruCache缓存demo

    2. **LRUCache的实现**:Android的LRUCache类是基于HashMap实现的,它维护了一个大小有限的缓存,通过`put()`方法添加数据,通过`get()`方法获取数据,并通过`size()`方法计算每个条目的大小。 3. **自定义LRUCache...

    LruCache缓存网络图片

    接下来,我们需要实现一个Key-Value对,Key通常是图片的URL,Value是解码后的Bitmap对象。然后将下载的图片添加到LRUCache中,如下所示: ```java public void addBitmapToMemoryCache(String key, Bitmap bitmap) ...

    基于LruCache listView缓存图片工具类

    总之,`LruCache`是Android开发者优化图片加载性能的一个强大工具,尤其在处理大量图片的ListView场景下,正确地使用它可以显著提升用户体验。通过`ImageLoaders.java`这样的工具类,开发者可以轻松地集成这种缓存...

    LruCache和DiskLruCache实现二级缓存的自定义ImageLoader

    本文将深入探讨如何使用`LruCache`和`DiskLruCache`实现一个二级缓存的自定义`ImageLoader`。 `LruCache`是Android SDK提供的内存缓存解决方案,全称为"Least Recently Used Cache"(最近最少使用缓存)。它的原理...

    Android使用LruCache缓存图片

    `LruCache`是Android对这种算法的实现,它通过维护一个双向链表和一个哈希表,来追踪最近使用过的项,并根据容量限制进行自动清理。 **2. 创建LruCache实例** 在Android中,首先我们需要创建一个`LruCache`实例。它...

    通过LruCache,DiskLruCache实现照片墙

    通过LruCache,DiskLruCache实现照片墙

    LruCache Demo

    LRUCache(Least Recently Used Cache)是Android系统提供的一个基于最近最少使用算法(LRU)的内存缓存机制。在Android开发中,特别是在处理大量图片或者数据时,LRUCache可以帮助我们有效地管理内存,避免因内存...

    Android LRUCache机制 缓存机制

    #### 三、LRUCache实现细节 ##### 3.1 类结构与初始化 ```java public class LruCache, V&gt; { private final LinkedHashMap, V&gt; map; // 使用LinkedHashMap存储键值对 private int size; // 已经存储的大小 ...

    LruCache+DiskLruCache实现照片墙

    LruCache+DiskLruCache实现照片墙

    LruCache缓存

    `LruCache`内部使用了一个`LinkedHashMap`作为数据结构,`LinkedHashMap`是一个有序的哈希表,它的特性使得可以方便地实现LRU策略。`LinkedHashMap`维护了两个双向链表,一个按照插入顺序,另一个按照访问顺序。`...

    C# LRUcache

    C# LRU缓存的设计和实现是一个重要的知识领域,它涉及到数据结构、算法以及高效的内存管理。 首先,理解LRU的基本原理至关重要。LRU策略的基本思想是:当缓存满时,最近最少使用的数据将被优先淘汰。这个策略基于一...

    PhotosWallDemo 结合LruCache和DiskLruCache

    本文将深入探讨一个名为PhotosWallDemo的项目,该项目巧妙地结合了LruCache和DiskLruCache这两种缓存策略,以实现高效、可靠的图片加载和存储。下面我们将详细解析这两个缓存机制及其在PhotosWallDemo中的具体应用。...

Global site tag (gtag.js) - Google Analytics