84 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
			
		
		
	
	
			84 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
| package com.novelbook.android.utils;
 | ||
| 
 | ||
| import java.util.LinkedHashMap;
 | ||
| import java.util.Map;
 | ||
| 
 | ||
| /**
 | ||
|  * 按照插入顺序排序的Map,当超出容量时,将最早插入的对象移除。
 | ||
|  *
 | ||
|  * @param <K>
 | ||
|  * @param <V>
 | ||
|  */
 | ||
| public class FIFOMap<K, V> extends LinkedHashMap<K, V> {
 | ||
| 	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<K, V> eldest) {
 | ||
| 		return maxSize < size();
 | ||
| 	}
 | ||
| 
 | ||
| 	@Override
 | ||
| 	public synchronized V put(K key, V value) {
 | ||
| 		return super.put(key, value);
 | ||
| 	}
 | ||
| 
 | ||
| 	@Override
 | ||
| 	public synchronized void putAll(Map<? extends K, ? extends V> 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<Integer, Integer> map = new FIFOMap<Integer, Integer>(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.");
 | ||
| 	}
 | ||
| }
 |