巧夺天工LinkedHashMap原来还可以淘汰元素?
前面关于HashMap的学习,我们知道HashMap无法保证顺序,本节的主角LinkedHashMap可以保证顺序。访问顺序or插入顺序
属性accessOrder值true则是访问的顺序,false则是插入的顺序,默认记录的是插入顺序。注意accessOrder加了final限制,说明确定访问顺序或插入顺序后就不能更改了。
极限的复用HashMap
LinkedHashMap类继承了HashMap,大部分功能复用HashMap,只是在此基础上记录了顺序publicclassLinkedHashMapK,VextendsHashMapK,VimplementsMapK,V{}
它的Entry是记录顺序的关键,它继承HashMap。Node,增加了before,after;是不是很熟悉,没错,就是所有的Entry构成一个双向链表。
重要的钩子方法put已经存在的key(或者replace)更新value后会调用,afterNodeAccessput不存在的key会调用afterNodeInsertionremove指定key会调用afterNodeRemoval
LinkedHashMap重写对应的钩子方法,维护对应的顺序voidafterNodeAccess(NodeK,Vp){}voidafterNodeInsertion(booleanevict){}voidafterNodeRemoval(NodeK,Vp){}
顺序保证
删除某个节点指针变化示意图,没图的话就太难了如果b为null,a变为双向链表头节点如果a为null,则b双向链表尾节点一般情况b。aftera;a。beforeb;
voidafterNodeRemoval(NodeK,Ve){unlinkLinkedHashMap。EntryK,Vp(LinkedHashMap。EntryK,V)e,bp。before,ap。after;p。beforep。afternull;if(bnull)heada;elseb。aftera;if(anull)tailb;elsea。beforeb;}
afterNodeAccess指针操作情况,对照着图,不然很难e。beforelast(操作前链表tail)e。afternullb。aftera;a。beforeb;
a与b指针与删除一样需要考虑空值情况,感兴趣的对照图自己推下。
voidafterNodeAccess(NodeK,Ve){movenodetolastLinkedHashMap。EntryK,Vlast;if(accessOrder(lasttail)!e){LinkedHashMap。EntryK,Vp(LinkedHashMap。EntryK,V)e,bp。before,ap。after;p。afternull;if(bnull)heada;elseb。aftera;if(a!null)a。beforeb;elselastb;if(lastnull)headp;else{p。beforelast;last。afterp;}tailp;modCount;}}值得注意的是newNode直接linkNodeLast放列表末尾
get方法如果accessOrder为true会放置调用afterNodeAccess即放到双向列表末尾
afterNodeInsertion
afterNodeInsertion其实我之前也没有明本,直到看了removeEldestEntry这个上面注释,主要用来淘汰较早的元素voidafterNodeInsertion(booleanevict){possiblyremoveeldestLinkedHashMap。EntryK,Vfirst;if(evict(firsthead)!nullremoveEldestEntry(first)){Kkeyfirst。key;removeNode(hash(key),key,null,false,true);}}
放码过来试试效果LinkedHashMapInteger,IntegerlinkedHashMapnewLinkedHashMapInteger,Integer(){protectedbooleanremoveEldestEntry(Map。EntryInteger,Integereldest){returnsize()5;};};for(inti1;i10;i){linkedHashMap。put(i,i);System。out。println(thesizeafterputiislinkedHashMap。size());}
输出结果thesizeafterputiis1thesizeafterputiis2thesizeafterputiis3thesizeafterputiis4thesizeafterputiis5thesizeafterputiis5thesizeafterputiis5thesizeafterputiis5thesizeafterputiis5
’原来除了保证顺序还可以实现LRU功能,确实介于牛A牛C之间。
终于讲完了,下期再来
预算15万左右落地,有什么推荐?你好很高兴回答问题,15万左右这个级别段可选的车还挺多的,主要是合资轿车和合资小型SUV和国产紧凑级SUV和中级车。合资轿车推荐1。首选一汽大众速腾1。2T版本A级,做工也比朗逸宝
1500左右的手机预算,不玩游戏像素高一点电池大一点,有吗?题主需要续航和拍照的千元机,续航没有问题,千元机最擅长大续航,可以参考售价1699的RedmiNote11Pro,一亿像素5160mAh超大电池,还有67W充电,基本你的需求都囊括
浪琴什么系列比较好?浪琴表在国内无人不知无人不晓,常年霸据万元霸主的地位。旗下的系列款式也是非常多,名匠系列康卡斯系列新月系列黛绰维纳系列嘉岚系列律雅系列圆舞曲系列瑰丽系列军旗系列博雅系列典藏系列马术
古人的生活条件到底有多苦?有多苦?大概率上活三十到四十岁,你的寿命就到头了。为什么会这样呢?古人不都吃的是绿色无公害食物吗?又没有现如今的各种污染问题困扰,绿水青山间,袅袅一炊烟,才活这么短,不科学啊!实际
医疗美容(医美)与整形美容的差别是什么?医美包括了医疗美容护肤和医疗美容手术。医疗美容皮肤科主要包括了水光针小气泡等日常护肤项目,也包括了中胚层疗法,想微针玻尿酸及超皮秒热玛吉等一系列的光电项目。医疗美容手术中心这里主要
退休的老人了还能不能在头条上创作了?退休的老人肯定能在头条上创作。头条是个大众舞台,只要你严格遵守党纪国法和头条君的有关规定,不分男女老幼,不论学历和资历,任何人经过注册认证审核后都可以在头条上发表文章微头条视频或回
深圳光明新区政府周围有大型购物商场吗?我因为在玖龙台买了公寓,较为详细的了解了周边的环境,目前来看有几个一个是本月22日开业(我本人严重怀疑能否成功)的蓝琼世界,大约10万的商业面积,目前可能开业的都是二三线品牌多一点
准备强制上岸,即将逾期,兄弟们给点经验?本人已经逾期一个半月了,目前是支付宝,拍拍贷,分期乐,马上金融,前期还接接电话,现在是一个电话都不接了,或者偶尔看心情接一个,接完之后感觉还是不接的好,弄得心情一团糟,接了也是对方
汽车钢板厚,车身重,就一定安全吗?车子的结构就像灯笼这个灯笼的结构和我们汽车的结构非常像的,都是里面一个骨架,外面糊了一层纸。这个纸在汽车上面它就是钢板了。钢板厚点薄点其实对我们的被动安全性是没有什么太大的影响的安
汽车发动机多点电喷和直喷有什么区别?哪个好点,请大神们指导指导?多点电喷缸内直喷,两种发动机技术属于两代产物,合格的量产机一定是直喷发动机更出色。多点电喷技术发动机从化油器时代升级为电子控制喷射后并不是直接到多点电喷,第一种电控喷油为单点电喷,
为什么有些人科目三考过了比拿到证的时候还兴奋?作为一个大龄的新手司机,我说一下我的看法。科目三,俗称大路考,在驾考中也许是最重要的,也是最实用的。科目一和科目四,是理论考试,对于绝大多数人来说难度不大,但是我现在开车发现这些理