LRU java实现

java

实现LRU缓存,用到了一个链表和 HashMap, HashMap保证了get/set的时间复杂度是O(1), 链表用来记录 最近最少使用的元素,以便用来淘汰。

package lru;

/**

* Created by fupeng on 2017/5/24.

*/

import java.util.HashMap;

public class LRUcache1<K, V> {

private final int MAX_CACHE_SIZE;

private Entry first;

private Entry last;

private HashMap<K, Entry<K, V>> hashMap;

public LRUcache1(int cacheSize) {

MAX_CACHE_SIZE = cacheSize;

hashMap = new HashMap<K, Entry<K, V>>();

}

public void put(K key, V value) {

Entry entry = getEntry(key);

if (entry == null) {

if (hashMap.size() >= MAX_CACHE_SIZE) {

hashMap.remove(last.key);

removeLast();

}

entry = new Entry();

entry.key = key;

}

entry.value = value;

moveToFirst(entry);

hashMap.put(key, entry);

}

public V get(K key) {

Entry<K, V> entry = getEntry(key);

if (entry == null) return null;

moveToFirst(entry);

return entry.value;

}

public void remove(K key) {

Entry entry = getEntry(key);

if (entry != null) {

if (entry.pre != null) entry.pre.next = entry.next;

if (entry.next != null) entry.next.pre = entry.pre;

if (entry == first) first = entry.next;

if (entry == last) last = entry.pre;

}

hashMap.remove(key);

}

private void moveToFirst(Entry entry) {

if (entry == first) return;

if (entry.pre != null) entry.pre.next = entry.next;

if (entry.next != null) entry.next.pre = entry.pre;

if (entry == last) last = last.pre;

if (first == null || last == null) {

first = last = entry;

return;

}

entry.next = first;

first.pre = entry;

first = entry;

entry.pre = null;

}

private void removeLast() {

if (last != null) {

last = last.pre;

if (last == null) first = null;

else last.next = null;

}

}

private Entry<K, V> getEntry(K key) {

return hashMap.get(key);

}

@Override

public String toString() {

StringBuilder sb = new StringBuilder();

Entry entry = first;

while (entry != null) {

sb.append(String.format("%s:%s ", entry.key, entry.value));

entry = entry.next;

}

return sb.toString();

}

class Entry<K, V> {

public Entry pre;

public Entry next;

public K key;

public V value;

}

}

参考

http://flychao88.iteye.com/blog/1977653

http://www.cnblogs.com/lzrabbit/p/3734850.html

以上是 LRU java实现 的全部内容, 来源链接: utcz.com/z/394851.html

回到顶部