首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linkedhashmap源码分析

,之后又添加了指向上一节点的before和指向下一节点的after,这样就形成了双向链表,用来记录元素的顺序....= last; last.after = p; } } LInkedHashMap并没有重写put()方法,但是重写了put()方法中会调用的newNode()方法,代码如上面所示...在重写后的newNode()方法中,调用父类的构造方法新建一个节点后,调用linkNodeLast()方法,将新插入的节点链接在双链表的尾部. remove()方法 void afterNodeRemoval...在HashMap的基础上,对每一个节点添加向前向后指针,这样所有的节点形成了双向链表,自然就是有序的. 2.如何保证顺序的正确以及同步 通过重写的一些关键的方法,在元素发生增删改查等行为时,除了在Hash...桶上进行操作,也对链表进行相应的更新,以此来保证顺序的正确. 3.如何实现两种顺序(插入顺序或者访问顺序)?

35830
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    深入浅出Java中的数据结构:LinkedHashMap详解

    因此,LinkedHashMap需要重写HashMap的put和remove方法,以保证在插入和删除元素时能够正确地更新链表。...put方法   当调用put方法插入一个新元素时,LinkedHashMap会调用父类HashMap的putVal方法来实现插入。...return null; }   在调用父类HashMap的put方法插入新元素之后,LinkedHashMap会在afterNodeInsertion方法中更新链表。...如果不需要删除节点,则会调用linkNodeLast方法将新节点插入到链表的尾部。   在删除节点时,调用removeNode方法删除节点后,会调用afterNodeRemoval方法来更新链表。...在使用LinkedHashMap时,需要注意它占用的内存较HashMap更多,删除节点时需要更新前驱节点的after指针和后继节点的before指针,性能可能略差一些。

    74151

    LinkedHashMap 源码解析

    LinkedHashMap 内部类 Entry 继承自 HashMap 内部类 Node,并新增了两个引用,分别是 before 和 after,是用于维护双向链表。...类层级关系图: image.png LinkedHashMap.Entry继承自HashMap的Node类,新增了before和after属性,用于维护前继和后继节点,以此形成双向链表。...在删除节点时,父类的删除逻辑并不会修复 LinkedHashMap 所维护的双向链表,这不是它的职责。那么删除及节点后,被删除的节点该如何从双链表中移除呢?当然,办法还算是有的。...上一节最后提到 HashMap 中三个回调方法运行 LinkedHashMap 对一些操作做出响应。所以,在删除及节点后,回调方法 afterNodeRemoval 会被调用。...假设我们访问下图键值为3的节点,访问前结构为: image.png 访问后,键值为3的节点将会被移动到双向链表的最后位置,其前驱和后继也会跟着更新。

    60051

    (49) 剖析LinkedHashMap 计算机程序的思维逻辑

    header表示双向链表的头,它的类型Entry是一个内部类,这个类是HashMap.Entry的子类,增加了两个变量before和after,指向链表中的前驱和后继,Entry的完整定义为: private...是HashMap.Entry中定义的方法,在HashMap中,这两个方法的实现为空,它们就是被设计用来被子类重写的,在put被调用且键存在时,HashMap会调用Entry的recordAccess方法...了解了内部组成,我们来看操作方法,先看构造方法。 构造方法 在HashMap的构造方法中,会调用init方法,init方法在HashMap的实现中为空,也是被设计用来被重写的。...put方法 在LinkedHashMap中,put方法还会将节点加入到链表中来,如果是按访问有序的,还会调整节点到末尾,并根据情况删除最久没被访问的节点。...在HashMap的put实现中,如果键已经存在了,则会调用节点的recordAccess方法,LinkedHashMap.Entry重写了该方法,如果是按访问有序,则调整该节点到链表末尾。

    53760

    图解LinkedHashMap原理

    还记得,上一篇HashMap解析中提到,在HashMap的构造函数中,调用了init方法,而在HashMap中init方法是空实现,但LinkedHashMap重写了该方法,所以在LinkedHashMap...lm.header); } } 在LinkedHashMap中,只有accessOrder为true,即是访问顺序模式,才会put时对更新的Entry进行重新排序...后面调用了LinkedHashMap.Entry的recordAccess方法,上面分析过put过程中这个方法,其实就是在访问顺序的LinkedHashMap进行了get操作以后,重新排序,把get的Entry...而上面介绍到,LinkedHashMap在初始化时,会调用init方法去初始化一个before和after都指向自身的Entry,但是put过程会把新增加的Entry加入到双向链表的表尾,所以只要LinkedHashMap...和before的方式引用。

    79220

    聊聊java中的哪些Map:(四)LinkedHashMap源码分析

    调用put、 get、getOrDefault、compute、computeIfPresent、merge等方法将导致对应条目的访问(假设它在调用完成后存在)。...Entry主要增加了before和after两个指针,以将HashMap的全部Entry变成双向链表。 我们可以看到的是,在jdk1.4的时候就完成了LinkedHashMap。...这也为我们后续代码重构提供了一个新的思路。 1.3 重要的成员变量 我们可以看到,在LinkedHashMap中扩张的成员变量位head、tail。分别指向链表的首和尾。...accessOrder只是控制了一个变量,但是后续在各get和remove的方法中将会根据这个变量变成不同的行为。...4.重要方法 4.1 put 我们先来看看LinkedHashMap中如何进行Put的。 实际上LinkedHashMap没有重载put方法,而是利用了HashMap中的put。

    45850

    【JDK1.8】JDK1.8集合源码阅读——LinkedHashMap

    可以从上图中看到,LinkedHashMap数据结构相比较于HashMap来说,添加了双向指针,分别指向前一个节点——before和后一个节点——after,从而将所有的节点已链表的形式串联一起来,从名字上来看...Entry作为基本的节点,可以看到LinkedHashMap的Entry继承自HashMap的Node,在其基础上加上了before和after两个指针,而TreeNode作为HashMap和LinkedHashMap...)e, b = p.before, a = p.after; //设置p的后一个节点为null,因为执行后p在链表末尾,after肯定为null p.after = null;...下面来简单说明一下: 正常情况下:查询的p在链表中间,那么将p设置到末尾后,它原先的前节点b和后节点a就变成了前后节点。...,head=p 3.5 LinkedHashMap的put()方法 接下来,让我们来看一下LinkedHashMap是怎么插入Entry的:LinkedHashMap的put方法调用的还是HashMap

    54740

    【JDK1.8】JDK1.8集合源码阅读——LinkedHashMap

    可以从上图中看到,LinkedHashMap数据结构相比较于HashMap来说,添加了双向指针,分别指向前一个节点——before和后一个节点——after,从而将所有的节点已链表的形式串联一起来,从名字上来看...Entry作为基本的节点,可以看到LinkedHashMap的Entry继承自HashMap的Node,在其基础上加上了before和after两个指针,而TreeNode作为HashMap和LinkedHashMap...)e, b = p.before, a = p.after; //设置p的后一个节点为null,因为执行后p在链表末尾,after肯定为null p.after = null;...下面来简单说明一下: 正常情况下:查询的p在链表中间,那么将p设置到末尾后,它原先的前节点b和后节点a就变成了前后节点。...,head=p 3.5 LinkedHashMap的put()方法 接下来,让我们来看一下LinkedHashMap是怎么插入Entry的:LinkedHashMap的put方法调用的还是HashMap

    701140

    LinkedHashMap的实现原理(复习)

    * 继承HashMap的Entry元素,又保存了其上一个元素before和下一个元素after的引用。   ...LinkedHashMap重写了init()方法,在调用父类的构造方法完成构造后,进一步实现了对其元素Entry的初始化操作。 Java代码   ?... = header;   }       3) 存储:    LinkedHashMap并未重写父类HashMap的put方法,而是重写了父类HashMap的put方法调用的子方法void addEntry...的get方法,实际在调用父类getEntry()方法取得查找的元素后,再判断当排序模式accessOrder为true时,记录访问顺序,将最新访问的元素添加到双向链表的表头,并从原来的位置删除。...LinkedHashMap提供了removeEldestEntry(Map.Entry eldest)方法,在将新条目插入到映射后,put和 putAll将调用此方法。

    66940
    领券