LinkedHashMap 的自动删除功能
🏷️ Java
LinkedHashMap
除了值是有序的之外,还可以自动删除最前面保存的值。
LinkedHashMap
中有一个 removeEldestEntry
方法,如果这个方法返回 true
,Map
中最前面添加的内容将被删除,它是在添加属性的 put
或 putAll
方法被调用后自动调用的。
这个功能主要是用在缓存中,用来限定缓存的最大数量,以防止缓存无限制地增长。
设置方法就是覆写 removeEldestEntry
方法,代码如下:
java
package liujiajia.me.learn.java;
import com.sun.deploy.util.StringUtils;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* Created by liujiajia on 2018/3/19.
*/
public class Application {
public static final int DEFAULT_CACHE_LIMIT = 10;
private static final Map<String, Object> viewCreationCache = new LinkedHashMap<String, Object>(DEFAULT_CACHE_LIMIT, 0.75f, true)
{
@Override
protected boolean removeEldestEntry(Map.Entry<String, Object> eldest) {
if (size() > DEFAULT_CACHE_LIMIT) {
viewCreationCache.remove(eldest.getKey());
return true;
} else {
return false;
}
}
};
public static void main(String[] args) {
for (int i = 0; i < 20; i++) {
viewCreationCache.put(String.valueOf(i), null);
System.out.println(viewCreationCache.size());
System.out.println(StringUtils.join(viewCreationCache.keySet(), ","));
}
}
}
执行结果:
java
1
0
2
0,1
3
0,1,2
4
0,1,2,3
5
0,1,2,3,4
6
0,1,2,3,4,5
7
0,1,2,3,4,5,6
8
0,1,2,3,4,5,6,7
9
0,1,2,3,4,5,6,7,8
10
0,1,2,3,4,5,6,7,8,9
10
1,2,3,4,5,6,7,8,9,10
10
2,3,4,5,6,7,8,9,10,11
10
3,4,5,6,7,8,9,10,11,12
10
4,5,6,7,8,9,10,11,12,13
10
5,6,7,8,9,10,11,12,13,14
10
6,7,8,9,10,11,12,13,14,15
10
7,8,9,10,11,12,13,14,15,16
10
8,9,10,11,12,13,14,15,16,17
10
9,10,11,12,13,14,15,16,17,18
10
10,11,12,13,14,15,16,17,18,19