共同学习Java源代码-数据结构-LinkedHashMap(一)

深入浅出Java中的数据结构LinkedHashMap详解 Java编程中,我们经常需要使用Map这个数据结构来存储键值对,而是Map的个实现类,它在HashMap的基础上维护了个双向链表,并且按照插入顺序或者访问顺序来迭代元素。既保证了HashMap的快速访问性能,又提供了顺序访问的能力,因此在某些场景下非常有用。本文将从源代码解析、应用场景案例、优缺点分析等多个方面对进行详细介绍,希望能帮助读者更好地理解的实现原理和使用方法。本文主要介绍了Java中的这个数据结构,并对其源代码进行了分析和解读。通过对的应用场景案例和优缺点分析,读者可以更好地理解。 阅读详情
public class LinkedHashMap<K,V>
    extends HashMap<K,V>

    implements Map<K,V>

这是按顺序存取的HashMap 继承自HashMap 实现了Map接口


    static class Entry<K,V> extends HashMap.Node<K,V> {
        Entry<K,V> before, after;
        Entry(int hash, K key, V value, Node<K,V> next) {
            super(hash, key, value, next);
        }
    }

这是键值对内部类 HashMap的TreeNode就是继承这个类 

这个类继承自HashMap的Node内部类 多了before和after两个属性 调用父类的构造方法


    transient LinkedHashMap.Entry<K,V> head;

    transient LinkedHashMap.Entry<K,V> tail;

head和tail节点

   

    final boolean accessOrder;

这个为false的话 就是按照插入顺序排序 为true的话就是按照访问顺序排序


    private void linkNodeLast(LinkedHashMap.Entry<K,V> p) {
        LinkedHashMap.Entry<K,V> last = tail;
        tail = p;
        if (last == null)
            head = p;
        else {
            p.before = last;
            last.after = p;
        }
    }

这个方法就是将参数p放到尾部的方法 

首先判断最后一个节点是否为空 如果为空 就将p赋给head 否则就将p放到队尾


    private void transferLinks(LinkedHashMap.Entry<K,V> src,
                               LinkedHashMap.Entry<K,V> dst) {
        LinkedHashMap.Entry<K,V> b = dst.before = src.before;
        LinkedHashMap.Entry<K,V> a = dst.after = src.after;
        if (b == null)
            head = dst;
        else
            b.after = dst;
        if (a == null)
            tail = dst;
        else
            a.before = dst;
    }

这个方法是将键值对进行重链接的方法

首先将参数src的before和after属性赋给参数dst的before和after属性

判断如果复制后dst的before为空 那么dst赋给head节点 否则将dst的before节点的after属性赋为dst

判断如果复制后dst的after为空 那么dst赋给tail节点 否则将dst的after节点的before属性赋为dst 

其实就是用dst替掉src


    void reinitialize() {
        super.reinitialize();
        head = tail = null;
    }

这个方法就是重写HashMap的清空所有属性方法 调用了父类的方法 然后把head和tail都清空了


    Node<K,V> newNode(int hash, K key, V value, Node<K,V> e) {
        LinkedHashMap.Entry<K,V> p =
            new LinkedHashMap.Entry<K,V>(hash, key, value, e);
        linkNodeLast(p);
        return p;
    }

这个方法是创建新节点的方法 

就是创建一个新的Entry对象 然后调用linkNodeLast放在队尾


    Node<K,V> replacementNode(Node<K,V> p, Node<K,V> next) {
        LinkedHashMap.Entry<K,V> q = (LinkedHashMap.Entry<K,V>)p;
        LinkedHashMap.Entry<K,V> t =
            new LinkedHashMap.Entry<K,V>(q.hash, q.key, q.value, next);
        transferLinks(q, t);
        return t;
    }

这个是替换节点的方法 创建一个新节点包装了参数p的哈希值 键和值 用新包装的对象替掉p 其实变化的就是next赋给了新节点t的next

 

    TreeNode<K,V> newTreeNode(int hash, K key, V value, Node<K,V> next) {
        TreeNode<K,V> p = new TreeNode<K,V>(hash, key, value, next);
        linkNodeLast(p);
        return p;
    }


    TreeNode<K,V> replacementTreeNode(Node<K,V> p, Node<K,V> next) {
        LinkedHashMap.Entry<K,V> q = (LinkedHashMap.Entry<K,V>)p;
        TreeNode<K,V> t = new TreeNode<K,V>(q.hash, q.key, q.value, next);
        transferLinks(q, t);
        return t;
    }

这两个是树节点的相关方法和上面一样 不说了


全面了解Java中常用的集合类:LinkedHashMap的应用与实践 Java种面向对象的编程语言,集合类是在Java编程中常用的数据结构,包括数组和集合。在Java中,集合类可以用来存储和操作组对象数据,是Java编程中不可或缺的部分。在本文中,我们将详细介绍Java个常用的集合类:LinkedHashMap。本文将重点介绍LinkedHashMap集合类的应用和实践。我们将从源代码解析开始,详细介绍LinkedHashMap的实现方式和内部结构。接着,我们将通过实际应用场景案例和优缺点分析,深入剖析LinkedHashMap的特点和适用范围。 阅读详情

相关推荐

Java零基础-集合:LinkedHashMap

Java集合框架中,是种特殊的Map实现,它继承自HashMap,并且保持了插入顺序或者访问顺序。对于Java零基础的学习者来说,理解的用法对于掌握Java集合操作非常重要。本文将详细介绍Java中的,包括其特性、操作方法、应用场景、优缺点分析,并通过代码示例和测试用例,帮助Java零基础的学习者快速掌握的使用。继承自HashMap,并且加入了个双向链表来维护元素的顺序。它可以根据元素的插入顺序或者访问顺序来遍历元素。以下是: 向映射中添加个键值对。: 根据键获取对应的值。

喵手的博客 1476

共同学习Java源代码-数据结构-LinkedHashMap()

public Set keySet() {         Set ks = keySet;         if (ks == null) {             ks = new LinkedKeySet();             keySet = ks;         }         return ks;     } 这个是获取keySet方法 就是判断keyS

ccdust的博客 242

滚雪球学Java(68):全面了解Java中常用的集合类:LinkedHashMap的应用与实践

🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!!

**My Coding Family** 1209

共同学习Java源代码-数据结构-LinkedHashMap()

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)

ccdust的博客 210

共同学习Java源代码-数据结构-LinkedHashMap()

public LinkedHashMap(int initialCapacity, float loadFactor) {         super(initialCapacity, loadFactor);         accessOrder = false;     }

ccdust的博客 198

共同学习Java源代码-数据结构-LinkedHashMap()

forEach和replaceAll方法跳过      abstract class LinkedHashIterator { 这个是内部类LinkedHashIterator 起的是迭代器的作用         LinkedHashMap.Entry next; 这个是下个节点属性         LinkedHashMap.Entry current; 这个是当前节点

ccdust的博客 204

JavaLinkedHashMap 源码解析

LinkedHashMap个有序的 Map,它维护元素的有序性,可以按照插入顺序或访问顺序排列元素。这个有序性是通过维护个双向链表来实现的。另外,LinkedHashMap 提供了参数来决定是否在访问元素时移动元素,以实现 LRU 缓存功能。这使得 LinkedHashMap 成为个非常有用的数据结构,适用于需要有序性和缓存功能的场景。

编程思维 1052

Java容器LinkedHashMap源代码解析

写在前面的话本文针对的是Java1.6进行的源码分析,与其他版本可能存在差异。概述LinkedHashMap是继承自HashMap,所以HashMap的特性,它都有。与HashMap不同之处在于,它自身还维护了个双向链表,这个链表是有序的,可以根据元素的插入顺序或者访问顺序排列。关于HashMap的解析请参考 Java容器HashMap源代码解析源代码解析1.LinkedHashMap属性

Kevin_zhai的博客 1084

Java中常见数据结构Map之LinkedHashMap

前面已经说完了HashMap, 接着来说下LinkedHashMap。 看到Linked就知道它是有序的Map,即插入顺序和取出顺序是致的, 究竟是怎样做到的呢? 下面就窥源码吧。 1, LinkedHashMap基本结构 LinkedHashMap是HashMap的个子类,它保留插入的顺序,如果需要输出的顺序和...

一枝花算不算浪漫的专栏 221

HashMap、HashTable、LinkedHashMap和TreeMap之间的区别

名称 HashMap LinkedHashMap TreeMap 共同点 线程不安全 线程不安全 线程不安全 不同点 数据无序 数据有序 数据有序还可以对数据进行排序 数据结构 数组+链表+红黑树(在JDK1.8中如果链表长度大于8的时候才转换为红黑树,平常不是) 双向链表+HashMap 红黑树 1.HashMap是个最常用的Map,它根据键的hashCode...

T_testView的博客 5768

源代码看TreeMap、HashMap、Hashtable、ConcurrentHashMap、LinkedHashMap特性

TreeMap、HashMap、Hashtable、ConcurrentHashMap、LinkedHashMap 这几个都是Map的实现类,但是都有各自的特点: HashMap是基于Hash算法实现Hashtable具有线性安全的特点TreeMap取出来的键值对是排序后LinkedHashMap是按照插入顺序取出来的键值对ConcurrentHashMap并发包下Map,也具有

专注;坚持 1771

深入Java集合学习系列:LinkedHashMap的实现原理

1. LinkedHashMap概述: LinkedHashMap是Map接口的哈希表和链接列表实现,具有可预知的迭代顺序。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 LinkedHashMap实现与HashMap的不同之处在于,后者维护着个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,该迭代顺序可...

absolute_chen的博客 154

深入Java集合:LinkedHashMap实现原理

LinkedHashMap 是 Map 接口的哈希表和链接列表实现,具有可预知的迭代顺序。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 迭代映射操作,你蒙了吗?相信很多童鞋在这块的学习,是段比较艰难的过程,各种不懂,各种蒙。O(∩_∩)O~ 自己在这块的总结中也是深感不安,好久不深入源码搞这块了,不过总体算下来,我们可以从源码中找到丝安慰,也希望自己的总结可以帮你解惑。

吴士龙 2709

Java集合深入学习总结-LinkedHashMap

1. LinkedHashMap概述:    LinkedHashMap是Map接口的哈希表和链接列表实现,具有可预知的迭代顺序。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。    LinkedHashMap实现与HashMap的不同之处在于,后者维护着个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,该迭代

peachli 936

JDK LinkedHashMap源代码解析

今天来分析下JDK  LinkedHashMap源代码   Java代码   public class LinkedHashMap       extends HashMap       implements Map    可以看到,LinkedHashMap继承自HashMap,并且也实现了Map接口,所以LinkedHashMap沿用了HashM

kiss_the_sun的专栏 990

多输入多输出 (MIMO) 多址接入信道 (MAC) 中的资源分配Matlab代码.rar

多输入多输出 (MIMO) 多址接入信道 (MAC) 中的资源分配Matlab代码.rar

上一篇: 共同学习Java源代码-数据结构-HashMap(二十)
下一篇: 共同学习Java源代码-数据结构-LinkedHashMap(二)
达霁吧
博客等级 码龄15年 61粉丝 168原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值