范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

分析java。util。LinkedHashMap

  介绍
  该实现与HashMap不同的是它维护一个双向链表,可以使HashMap有序。与HashMap一样,该类不安全。 结构
  和HashMap的结构非常相似,只不过LinkedHashMap是一个双向链表
  LinkedHashMap   分为两种节点 Entry  和TreeNode  节点
  Entry  节点结构:class Entry extends HashMap.Node {      Entry before, after;      Entry(int hash, K key, V value, Node next) {          super(hash, key, value, next);      }  }
  before   和 after   是双向链表中的前继和后继节点
  TreeNode  节点和HashMap  中的一样
  从这里能看出LinkedHashMap  是一个双向链表
  LinkedHashMap   有如下属性:transient LinkedHashMap.Entry head;transient LinkedHashMap.Entry tail;final boolean accessOrder;
  head   和 tail  很好理解就是双向链表的头和尾
  HashMap  中没有accessOrder  这个字段,这也是与HashMap  最不同的地方,该类有两种取值分别代表不同的意思 :true,按照访问顺序排序 false,按照插入顺序排序 HashMap预留的一些方法
  HashMap   预留了一些方法提供给 LinkedHashMap   使用// LinkedHashMap重写了以下四个方法来保证双向队列能够正常工作// 创建一个Node节点Node newNode(int hash, K key, V value, Node next){...}// 创建树节点TreeNode newTreeNode(int hash, K key, V value, Node next) {...}// 树节点和普通节点相互转换Node replacementNode(Node p, Node next) {...}TreeNode replacementTreeNode(Node p, Node next) {...}  // HashMap未实现,留给LinkedHashMap实现// 后置处理// 访问节点后如何处理void afterNodeAccess(Node p) { }  // 插入节点后如何处理void afterNodeInsertion(boolean evict) { }  // 移除节点后如何处理void afterNodeRemoval(Node p) { }
  afterNodeAccess   、afterNodeInsertion  、afterNodeRemoval   这三个方法保证了LinkedHashMap  有序,分别会在get   、put  、remove   后调用
  put  和remove   都对顺序没有影响,因为在操作的时候已经调整好了(put放在)。但是get  是对顺序有影响的(被访问到了),所以需要重写该方法:public V get(Object key) {      Node e;      // 获取节点    if ((e = getNode(hash(key), key)) == null)          return null;      // 改变顺序    if (accessOrder)          afterNodeAccess(e);      return e.value;  }
  通过 afterNodeAccess  来改变该节点(P)的顺序,该方法分为一下几步:拆除需要移动的节点P 处理前置节点,前置节点有两种情况前置节点为空,表示P为头节点前置节点不为空,表示P为中间节点 处理后置节点后置节点为空,表示P为尾节点后置节点不为空,表示P为中间节点 将该节点移动到 tail  处void afterNodeAccess(Node e) { // move node to last      LinkedHashMap.Entry last;      if (accessOrder && (last = tail) != e) {          LinkedHashMap.Entry p =              (LinkedHashMap.Entry)e, b = p.before, a = p.after;          p.after = null;          if (b == null)              head = a;          else              b.after = a;          if (a != null)              a.before = b;          else              last = b;          if (last == null)              head = p;          else {              p.before = last;              last.after = p;          }          tail = p;          ++modCount;      }  }
  afterNodeInsertion   则在putVal  中调用
  基本逻辑是如果参数为true  则尝试删除头节点,但是还需要满足头节点是最"老"的,具体的与removeEldestEntry  配合使用,可以继承LinkedHashMap  并定制, LinkedHashMap  是恒为false  的。protected boolean removeEldestEntry(Map.Entry eldest) {      return false;  }
  如果所有条件都满足则删除头节点 void afterNodeInsertion(boolean evict) { // possibly remove eldest      LinkedHashMap.Entry first;      if (evict && (first = head) != null && removeEldestEntry(first)) {          K key = first.key;          removeNode(hash(key), key, null, false, true);      }  }
  afterNodeRemoval  则在removeNode  成功删除节点之后调用:
  用来保证在双向链表中删除一个节点仍然能够使结构不被破坏
  为被删除节点的头和尾节点建立联系:void afterNodeRemoval(Node e) { // unlink      LinkedHashMap.Entry p =          (LinkedHashMap.Entry)e, b = p.before, a = p.after;      p.before = p.after = null;      if (b == null)          head = a;      else          b.after = a;      if (a == null)          tail = b;      else          a.before = b;  }应用实现LRU
  LRU是一种缓存置换机制,LRU (Least Recently Used)将最近最少使用的内容替换掉。实现非常简单,每次访问某个元素,就将这个元素浮动到栈顶。这样最靠近栈顶的页面就是 最近经常访问 的,而被压在栈底的就是 最近最少使用 的,只需要删除栈底的元素。
  LinkedHashMap  非常方便实现LRU,LinkedHashMap  在put  操作时同时会判断是否需要删除最"老"的元素。只需要重写removeEldestEntry  方法,使得超过容量就删除最"老"的元素。
  下面是具体实现: public class LRU extends LinkedHashMap {        /**       * 最大容量       * 

* Note: 用位运算就不需要将十进制转换为二进制,直接就为二进制。 */ private final int MAX_CAPACITY = 1 << 30; /** * 缓存的容量 */ private int capacity; public LRU(int capacity) { this(true, capacity); } public LRU(boolean accessOrder, int capacity) { this(1 << 4, 0.75f, accessOrder, capacity); } public LRU(int initialCapacity, float loadFactor, boolean accessOrder, int capacity) { super(initialCapacity, loadFactor, accessOrder); this.capacity = capacity; }}   测试: LRU lru = new LRU(10); for (int i = 0; i < 10; i++) { lru.put(i, i * i); System.out.println("put: (" + i + "," + i * i + ")"); int randomKey = (int) (Math.random() * i); System.out.println("get "+randomKey+": " + lru.get(randomKey)); System.out.println("head->"+lru+"<-tail"); }   结果: put: (0,0)get 0: 0head->{0=0}<-tail---------------put: (1,1)get 0: 0head->{1=1, 0=0}<-tail---------------put: (2,4)get 1: 1head->{0=0, 2=4, 1=1}<-tail---------------   喜欢的朋友点赞,转发加关注。


华为nova9SE配置怎么样,有哪些亮点和不足?2022年3月16日,华为给广大消费者带来了一款名为华为nova9SE的手机机型。那么问题来了,华为nova9SE这款手机的配置到底怎么样呢?有哪些亮点和不足呢?关于这些问题,接下养老理财试点扩容后,新产品来了今年3月1日起,养老理财产品试点范围由四地四机构扩展为十地十机构。这一消息官宣后不到半个月,就已有新产品在十地上线。2只产品在十地开售惠及更多投资者试点扩容以来,已有2只养老理财试每年的养老金增长会经历哪些步骤?差额会何时发放到老人手中?每一年的养老金调整,都会经历相当复杂的酝酿和实施过程。不过2022年的养老金调整已经稳了,3月5日的国家会议已经明确今年养老金会继续适度调整。那么养老金的调整,究竟需要经历哪些步骤定了!2022年养老金18连涨,这4类人无缘享受,希望你不在其中时至今日,关于2022年养老金是否上调的争论已经有了明确答案,国家在2022年政府工作报告中明确提出,适当提高退休人员基本养老金和城乡居民基础养老金标准,等于是正式宣告了2022年场均得分创生涯新高,该花多少钱续约这几位NBA球员才合适呢?2122赛季NBA常规赛已经进入尾声,下面几位在2122赛季打出了生涯最佳表现,他们的续约问题应该会让球队老板感到非常为难,大家说这几位的续约合同该给多少呢?乔丹普尔,2122赛季国家发放四大礼包,包含个人所得税抵扣教师补助医保补助随着生活水平的提高,所有人都希望能到自己手里更多的钱。近日,国家出台相关的政策来保证人民的钱袋子越来越鼓,政策大致涵盖个税补助教师福利待遇居民医保补助以及企业退税等几大方面,对大多什么时候是买房抄底的最佳时机?可以肯定的说是房企还债的高峰期。眼下新一轮的还债高峰来了,在风声鹤唳的市场环境中,购房者该如何选择安全的开发商买到放心的房子呢?给大家三条建议,过去的几年,不少房企走高负债高周转高iPhoneXR只要1100元?网友工业垃圾,给我都不要网友在群里发了几张iPhoneXR的照片,说自己想买。因为价格便宜,但该机的缺点则是有隐藏ID。有群友就吐槽,说给我都不要,拿回来用还提心吊胆的!万一被原机主反锁,就是一块砖头,换春游江湾城公园昨日坐公交车到江湾城,刚进公园就远远看见一棵棵树开满了海棠花,造型名异的灌木笼,长长的观赏道两旁迎春花杜鹃花绽开太阳像一位刚刚饮醉,脸上泛起瓣瓣酡红的姑娘,借着酒劲把云层掀开,把她北海公园桃花映白塔,迷人春景已上线!雨后的京城春光明媚淋过春雨的北海公园里湿润凉爽的空气中包裹着清新的泥土味深深地呼吸就像薄荷一般提神醒脑泛着鹅黄和新绿的柳枝被一阵清风微微撩动在岸边远远望去一团团生机勃勃的色彩轻轻跃走啊,一起去公园闻最有艺术感的牛粪好天气的公园,让人自动变得友善会觉得大声说笑的家庭格外和谐,互相拍照然后腻在一起晒太阳的情侣如此般配,就连歪歪扭扭的帐篷和满得要溢出来野餐布也有种笨拙的可爱。以上都是一些平凡公园带
早知道美股收涨央行决定下调金融机构外汇存款准备金率摘要央行决定下调金融机构外汇存款准备金率。国务院办公厅印发关于进一步释放消费潜力促进消费持续恢复的意见。市场监管总局2022年反不正当竞争专项执法行动启动。国家烟草专卖局建立对电子人民币贬值,我们会受影响吗?钱不值钱了怎么办?1hr你知道吗。就在此时此刻,人民币贬值了!短短4天大跌1500点,这一切背后究竟意味着什么?情况大家可能还不知道啊,自打2月以来,中美利率倒挂,人民币正在一路贬值!从4月19号到解码基金一季报张坤葛兰等千亿基金经理跌落神坛,这几家公司被大规模增持21世纪经济报道记者李域深圳报道2022年第一个季度,在市场的剧烈调整之下,基金经理帮基民亏了1。33万亿元。天相投顾数据显示,受春节后A股调整影响,一季度公募基金整体亏损1。33午评A股三大指数震荡反弹创业板指涨近2,零售基建等板块抢眼金融界4月26日消息今日A股三大指数小幅高开,盘初一小时市场宽幅震荡,沪指跌破2900点,盘中各大指数出现一波快速上行,深成指涨超1,创业板指收复2200点并涨超2,午前A股陷入盘宝宝长期夜奶不利于发育,这位宝妈戒夜奶的4个妙招,值得借鉴这几天,办公室同事发现小徐状态太差了,面容疲乏,工作也频频出错。好心的办公室大姐,私下里问小徐是不是遇到了什么困难事?小徐叹息道唉!都是因为孩子!作为新晋宝妈的小徐,因为孩子要吃夜奶睡对婴儿有什么危害?奶睡是指宝宝需要含着乳头或者奶瓶才能安然入睡的一种习惯。这是很多宝宝都会出现的问题,虽然奶睡会让宝宝能更快的入睡,但从长远来看,对孩子来说却是有着很大的危害。1影响牙齿发育婴儿在夜婴儿为什么总哭闹?该怎么办?小婴儿呱呱坠地,来到这个美丽的世界,他就像一个小天使,但小婴儿有一个特殊的表达方式哭闹,他的哭闹就像我们说话表达自己一样,需要我们去读懂他,我们来看看婴儿为什么会哭闹吧!1饿了把手景区,蒸汽轨道小火车的无级变速技术咋样蒸汽轨道小火车采用无级变速技术,一般认为,如果电动旅游观光车有三档变速箱,性能也会有显著提高。因此,电动观光列车需要变速器。景区轨道小火车无级变速器是指在变速器范围内连续获得任何传德国芯片巨头发声愿为中国供应芯片!100不包含美国技术众所周知,自从去年美国公布了对华为的禁令以来,对华为发起了多次制裁,而在美国对华为的第三轮制裁中,制裁的就是华为的芯片,而随着美国芯片禁令的发布,这也导致了全球的半导体产业将要发生如果你现在不是很快乐,那么就开始减肥吧大家好!我是华蕾蕾,一位学习型全职二胎妈妈。点击右上方关注,与你分享成长心得与干货,以及生活写作与养娃。如果你是一位微胖的妈妈,如果你经常觉得生活没有热情和冲劲儿,如果你现在过得不新生儿护理该怎么做?记住别对宝宝做这3件事怀胎十月一朝分娩,孩子代表了一个家庭的希望,等待了十个月,对孩子充满期待满怀爱。孩子降生之后,父母亲人们总是非常高兴,恨不得把所有都给孩子,但是,新生儿护理并不是那么简单的事情,稍