缓存实现策略之先进先出(FIFO)Java实现

Java 小智 297℃ 0评论

package com.cache;

/**
 * First In First Out,先进先出
 * 这个和LRUCache实现方式是一样的,只是实例化LinkedHashMap时传参不一样
 *
 */
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;

public class FIFOCache {
	private final int MAX_CACHE_SIZE;
	private final float DEFAULT_LOAD_FACTORY = 0.75f;

	LinkedHashMap map;

	public FIFOCache(int cacheSize) {
		MAX_CACHE_SIZE = cacheSize;
		/*
		 * 由于LinkedHashMap是为自动扩容的,当table数组中元素大于
		 * Capacity * loadFactor的时候,就会自动进行两倍扩容。
		 * 但是为了使缓存大小固定,就需要在初始化的时候传入容量大小和负载因子。
		 * 为了使得到达设置缓存大小不会进行自动扩容,需要将初始化的大小
		 * 进行计算再传入,可以将初始化大小设置为(缓存大小 / loadFactor) + 1,
		 * 这样就可以在元素数目达到缓存大小时,也不会进行扩容了。
		 */
		int capacity = (int) Math.ceil(MAX_CACHE_SIZE / DEFAULT_LOAD_FACTORY)
				+ 1;
		/*
		 * 第三个参数设置为true,代表LinkedList按访问顺序排序,可作为LRU缓存
		 * 第三个参数设置为false,代表按插入顺序排序,可作为FIFO缓存
		 */
		map = new LinkedHashMap(capacity, DEFAULT_LOAD_FACTORY, false) {
			private static final long serialVersionUID = 2009680157678631777L;

			@Override
			protected boolean removeEldestEntry(Map.Entry eldest) {
				return size() > MAX_CACHE_SIZE;
			}
		};
	}

	public synchronized void put(K key, V value) {
		map.put(key, value);
	}

	public synchronized V get(K key) {
		return map.get(key);
	}

	public synchronized void remove(K key) {
		map.remove(key);
	}

	public synchronized Set> getAll() {
		return map.entrySet();
	}

	@Override
	public String toString() {
		StringBuilder stringBuilder = new StringBuilder();
		for (Map.Entry entry : map.entrySet()) {
			stringBuilder.append(String.format("%s: %s  ", entry.getKey(),
					entry.getValue()));
		}
		return stringBuilder.toString();
	}

	public static void main(String[] args) {
		FIFOCache lru1 = new FIFOCache<>(5);
		lru1.put(1, 1);
		lru1.put(2, 2);
		lru1.put(3, 3);
		System.out.println(lru1);
		lru1.get(1);
		System.out.println(lru1);
		lru1.put(4, 4);
		lru1.put(5, 5);
		lru1.put(6, 6);
		System.out.println(lru1);
	}
}

运行结果


1: 1  2: 2  3: 3  
1: 1  2: 2  3: 3  
2: 2  3: 3  4: 4  5: 5  6: 6  

本文固定链接:心知博客 » 缓存实现策略之先进先出(FIFO)Java实现
本站内容除特别标注外均为原创,欢迎转载,但请保留出处!

喜欢 (0)
发表我的评论
取消评论
表情

请填写您的昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址