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