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."); | |||
|  | 	} | |||
|  | } |