package com.novelbook.android.utils; import java.util.LinkedHashMap; import java.util.Map; /** * 按照插入顺序排序的Map,当超出容量时,将最早插入的对象移除。 * * @param * @param */ public class FIFOMap extends LinkedHashMap { private static final long serialVersionUID = 27034646516234314L; protected int maxSize; public FIFOMap(int maxSize) { super(maxSize, 0.75f, false); this.maxSize = maxSize; } @Override protected boolean removeEldestEntry(Entry eldest) { return maxSize < size(); } @Override public synchronized V put(K key, V value) { return super.put(key, value); } @Override public synchronized void putAll(Map m) { super.putAll(m); } @Override public synchronized V remove(Object key) { return super.remove(key); } public void setCapacity(int size) { maxSize = size; } public int getCapacity() { return maxSize; } public static void main(String[] args) { int maxSize = 100; FIFOMap map = new FIFOMap(maxSize); for (int i = 1; i <= maxSize; i++) { map.put(i, i); assertTrue(map.size() == i); } for (int i = 1; i <= maxSize; i++) { map.put(i, i); assertTrue(map.size() == maxSize); } for (int i = 101; i <= 100 + maxSize; i++) { map.put(i, i); assertTrue(map.size() == maxSize); } for (int i = 191; i <= 100 + maxSize; i++) { map.remove(i); assertTrue(map.size()== maxSize + 190 - i ); } for (int i = 101; i <= 100 + maxSize; i++) { map.put(i, i); } for (int i = 1; i <= 10000 + maxSize; i++) { map.put(i, i); } assertTrue(map.size() == maxSize); } private static void assertTrue(boolean flag) { if ( !flag ) System.out.println("should be true. but is false."); } }