永发信息网

linkedhashmap initialcapacity和loadfactor初始值取多少合理

答案:2  悬赏:10  手机版
解决时间 2021-01-26 19:52
linkedhashmap initialcapacity和loadfactor初始值取多少合理
最佳答案
缓存这个东西就是为了提高运行速度的,由于缓存是在寸土寸金的内存里面,不是在硬盘
里面,所以容量是很有限的。LRU这个算法就是把最近一次使用时间离现在时间最远的数据删除掉。先说说List:每次访问一个元素后把这个元素放在
List一端,这样一来最远使用的元素自然就被放到List的另一端。缓存满了t的时候就把那最远使用的元素remove掉。但更实用的是
HashMap。因为List太慢,要删掉的数据总是位于List底层数组的第一个位置,删掉之后,后面的数据要向前补位。。所以复杂度是O(n),那就
用链表结构的LinkedHashMap呗~,LinkedHashMap默认的元素顺序是put的顺序,但是如果使用带参数的构造函数,那么
LinkedHashMap会根据访问顺序来调整内部 顺序。
LinkedHashMap的get()方法除了返回元素之外还可以把被访问的元素放到链表的底端,这样一来每次顶端的元素就是remove的元素。

构造函数如下:

public LinkedHashMap (int initialCapacity, float loadFactor, boolean accessOrder);

initialCapacity 初始容量

loadFactor 加载因子,一般是 0.75f

accessOrder false 基于插入顺序 true 基于访问顺序(get一个元素后,这个元素被加到最后,使用了LRU 最近最少被使用的调度算法)

来个例子吧:

import java.util.*;

class Test
{
public static void main(String[] args) throws Exception{

Map map=new LinkedHashMap<>(10,0.75f,true);
map.put(9,3);
map.put(7,4);
map.put(5,9);
map.put(3,4);
//现在遍历的话顺序肯定是9,7,5,3
//下面访问了一下9,3这个键值对,输出顺序就变喽~
map.get(9);
for(Iterator> it=map.entrySet().iterator();it.hasNext();){
System.out.println(it.next().getKey());
}
}
}

输出

7
5
3
9

好玩吧~

下面开始实现LRU缓存喽~

import java.util.*;
//扩展一下LinkedHashMap这个类,让他实现LRU算法
class LRULinkedHashMap extends LinkedHashMap{
//定义缓存的容量
private int capacity;
private static final long serialVersionUID = 1L;
//带参数的构造器
LRULinkedHashMap(int capacity){
//调用LinkedHashMap的构造器,传入以下参数
super(16,0.75f,true);
//传入指定的缓存最大容量
this.capacity=capacity;
}
//实现LRU的关键方法,如果map里面的元素个数大于了缓存最大容量,则删除链表的顶端元素
@Override
public boolean removeEldestEntry(Map.Entry eldest){
System.out.println(eldest.getKey() + "=" + eldest.getValue());
return size()>capacity;
}
}
//测试类
class Test{
public static void main(String[] args) throws Exception{

//指定缓存最大容量为4
Map map=new LRULinkedHashMap<>(4);
map.put(9,3);
map.put(7,4);
map.put(5,9);
map.put(3,4);
map.put(6,6);
//总共put了5个元素,超过了指定的缓存最大容量
//遍历结果
for(Iterator> it=map.entrySet().iterator();it.hasNext();){
System.out.println(it.next().getKey());
}
}
}

输出结果如下

9=3
9=3
9=3
9=3
9=3
7
5
3
6

分析一下:使用带参数构造器,且启用LRU模式的LinkedHashMap会在每次有新元素加入的时候,判断当前储存元素是否超过了缓存上限,也就是执行
一次removeEldestEntry方法,看最后的遍历结果,发现果然把9删除了,LRU发挥作用了~
全部回答
我。。知。。道 加。。我。。私。。聊
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
为什么航空障碍灯有一个2芯芯线一个3芯线
写出三个注视相近的词
云顶spa馆地址在什么地方,我要处理点事
NA离子从小肠进入血液是否消耗ATP
成语履足差肩的意思是什么啊?有知道释义的请
南港农家乐园汽贸城地址好找么,我有些事要过
根据孟德尔遗传规律推断,下列结构中可能含有
下列各句中,没有语病的一句是( )A. 那烟雨
中原武林风白酒多少钱盒
给孩子适当的娱乐时间英语怎么说
广州白云国际机场有到沙巴的直达航班吗?
梦到冰箱里很多蔬菜水果
诛仙3怎么去混沌领牌子
笔记本电脑触摸区域手指轻点没反应
成语罗织罪名的意思是什么啊?有知道释义的请
推荐资讯
小聪明幼儿园(濮阳南乐县)地址有知道的么?有
小月剪发室地址好找么,我有些事要过去
属猪的女孩过生日喜欢什么礼物
女生青春期束胸束腰的危害
请问红楼梦有没有好的白话文解说版本?就是又
荣昌丽都商务宾馆地址在什么地方,我要处理点
江西东北理工大学在哪
人民法院诉讼与人民调解对接中心在哪里啊,我
大众彩扩摄影部地址在什么地方,想过去办事
【千头万绪的意思】千头万绪的意思是什么啊
新浪网吧怎么去啊,我要去那办事
为什么玩王者荣耀的都忘了或者不知道是腾讯天
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?