LinkedHashMap- accessOrder参数的意义
构造方法
public LinkedHashMap(int initialCapacity,
float loadFactor,
boolean accessOrder) {
accessOrder的取值只有true和false
示例:
static int capacity=4;
//为true的情况
static LinkedHashMap<Integer,String> map=new LinkedHashMap(4, 0.75f,true){
@Override
protected boolean removeEldestEntry(Map.Entry eldest) {
return size()-capacity>0;
}
};
//为false的情况
static LinkedHashMap<Integer,String> map2=new LinkedHashMap(4, 0.75f,false){
@Override
protected boolean removeEldestEntry(Map.Entry eldest) {
return size()-capacity>0;
}
};
public static void test(){
map.put(1,"aa");
map.put(2,"bb");
map.put(3,"cc");
map.put(4,"dd");
map.get(1);
map.put(5,"ff");
map.put(4,"zz");
for(Map.Entry<Integer,String> entry:map.entrySet()){
System.out.println(entry.getKey()+" "+entry.getValue());
}
}
输出:
3 cc
1 aa
5 ff
4 zz
public static void test2(){
map2.put(1,"aa");
map2.put(2,"bb");
map2.put(3,"cc");
map2.put(4,"dd");
map2.get(1);
map2.put(5,"ff");
map2.put(4,"zz");
for(Map.Entry<Integer,String> entry:map2.entrySet()){
System.out.println(entry.getKey()+" "+entry.getValue());
}
}
输出:
2 bb
3 cc
4 zz
5 ff
结论1:对比两个测试用例发现,当accessOrder为false时,通过get访问数据,不会改变元素的存放顺序。为true时,会改变。
map: 1-aa 2-bb 3-cc 4-dd 访问了1元素 变为 2-bb 3-cc 4-dd 1-aa
所以存放数据5-ff时会覆盖最久未使用的2-bb
3-cc 4-dd 1-aa 5-ff
但是对于map2
map2: 1-aa 2-bb 3-cc 4-dd 访问了1元素 元素顺序不变化
所以存放数据5-ff时会覆盖最先插入的1-aa
2-bb 3-cc 4-dd 5ff
结论2:当accessOrder为false时,对已经有的数据重新存入,不会改变存放顺序。但是为true时,会改变。
map: 3-cc 4-dd 1-aa 5-ff 存入数据 4-zz 变为:3-cc 1-aa 5-ff 4-zz
因为对于key4,重新存入了一次改变了顺序
对于map2
2-bb 3-cc 4-dd 5ff 存入数据 元素顺序不变化 2-bb 3-cc 4-zz 5ff
显然,通过结结果发现,顺序并未改变