先写一个关于排序的测试
public static void main(String[] args) {
int initialCapacity = 10;// 自定义初始化容量
float loadFactor = 0.75f;// 装载因子
boolean accessOrder = true;// 访问排序方式
// 创建实例
Map<Integer, Integer> linkedHashMap = new LinkedHashMap<>(initialCapacity, loadFactor, accessOrder);
// 添加10个参数
for (int i = 0; i < 10; i++) {
linkedHashMap.put(i, i);
}
System.out.println(linkedHashMap.size() == 10 ? "已经最大了" : linkedHashMap.size() + "");
System.out.println("begin iterating...");
// 访问前是按照默认的插入顺序进行打印的
for (Iterator<Map.Entry<Integer, Integer>> it = linkedHashMap.entrySet().iterator(); it.hasNext();) {
Map.Entry<Integer, Integer> next = it.next();
System.out.println(next.getValue());
}
System.out.println("访问后看看排序");
linkedHashMap.get(3);
linkedHashMap.get(4);
linkedHashMap.get(5);
// 每访问一个元素,然后放到表的最后,改变了表中数据的存储顺序
for (Iterator<Map.Entry<Integer, Integer>> it = linkedHashMap.entrySet().iterator(); it.hasNext();) {
Map.Entry<Integer, Integer> next = it.next();
System.out.println(next.getValue());
}
}
再来一个展示lru的缓存原理的测试
public static void main(String[] args) {
final int cacheSize = 10;
@SuppressWarnings("serial")
//重写移除最老数据的方法
Map<Integer, Integer> map = new LinkedHashMap<Integer, Integer>((int) Math.ceil(cacheSize / 0.75f) + 1, 0.75f,
true) {
@Override
protected boolean removeEldestEntry(Map.Entry<Integer, Integer> eldest) {// 如果true,移除最早的数据
return size() > cacheSize;
}
};
// 添加数据
for (int i = 0; i < 15; i++) {
map.put(i, i);
}
// 因为定义的初始化容量为10,但是添加时,添加了15次,所以前五个数据已经没了
for (Iterator<Map.Entry<Integer, Integer>> it = map.entrySet().iterator(); it.hasNext();) {
Map.Entry<Integer, Integer> next = it.next();
System.out.println(next.getValue());
}
}
结果:
5
6
7
8
9
10
11
12
13
14