Friday, March 7, 2014

Implementing Least recently used (LRU) cache in Java


import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedQueue;

/**
 * Created by gpzpati on 3/3/14.
 */
public class LRUCache {

    private final int maxSize;
    private ConcurrentHashMap map;
    private ConcurrentLinkedQueue queue;

    public LRUCache(final int maxSize) {
        this.maxSize = maxSize;
        map = new ConcurrentHashMap(maxSize);
        queue = new ConcurrentLinkedQueue();
    }

    /**
     * @param key - may not be null!
     * @param value - may not be null!
     */
    public void put(final Key key, final Value value) {
        if (map.containsKey(key)) {
            queue.remove(key); // remove the key from the FIFO queue
        }

        while (queue.size() >= maxSize) {
            Key oldestKey = queue.poll();
            if (null != oldestKey) {
                map.remove(oldestKey);
            }
        }
        queue.add(key);
        map.put(key, value);
    }

    /**
     * @param key - may not be null!
     * @return the value associated to the given key or null
     */
    public Value get(final Key key) {
        return map.get(key);
    }

    public static void main(String[] argv){
        LRUCache lruCache = new LRUCache(3);
        lruCache.put("Sunil","36");
        lruCache.put("Leena","31");
        lruCache.put("Jiya","7");
        System.out.println(lruCache.get("Sunil"));
        lruCache.put("Navya","2");
        System.out.println(lruCache.get("Sunil"));

    }
}

No comments:

Post a Comment