当前位置: 首页 > 知识库问答 >
问题:

理解java中的acessorder LinkedHashMap实现

阎修杰
2023-03-14

据我所知,LinkedHashMap扩展了HashMap和LinkedHashMap。条目扩展了HashMap。条目也是如此。

LinkedHashMap有两个主要属性1)头,它是LinkedHashMap。入口节点。2)继承的表是HashMap。条目[]数组。现在LinkedHashMap中的表被分配了LinkedHashMap数组。在运行时输入,这由以下方法处理:

/**
     * This override differs from addEntry in that it doesn't resize the
     * table or remove the eldest entry.
     */
    void createEntry(int hash, K key, V value, int bucketIndex) {
        HashMap.Entry<K,V> old = table[bucketIndex];
        Entry<K,V> e = new Entry<>(hash, key, value, old);
        table[bucketIndex] = e;
        e.addBefore(header);
        size++;
    }

该方法的前三行实际上会转换HashMap。进入LinkedHashMap。条目,并维护条目前后的引用,以使标题前指向顺序中的最后一个元素,最后一个元素后指向形成圆圈的标题。

现在,当我们创建任意一个映射的实例(使用新构造函数)时,没有为table属性分配内存,因为它刚刚初始化为空表。

Map<String, String> linkedHashMap = new LinkedHashMap<String, String>();

现在让我们说我们做我们的赌注:-

linkedHashMap.put("a", "A");
linkedHashMap.put("b", "B");
linkedHashMap.put("c", "C");

在这些语句之后,我们的LinkedHashMap数据结构(表数组在第一次放置后初始化)看起来就像图片中的一样。为了便于参考,我标记了元素a、b和c。我知道真正的顺序不会相同。我发现这个数据结构相当复杂——引用太多了。它有双链表,维护方式非常不同,用于不同的目的,也有普通hashmap的单链表,两者都在同一个条目中。我的理解正确吗?

共有1个答案

充栋
2023-03-14

你在代码方面做得很好,这很好!然而,LinkedHashMap并不像你想要的那么复杂。它实际上是HashMap的一个非常简单的扩展,其唯一目的是保持元素添加的顺序†。

该方法的前三行实际上会转换HashMap。进入LinkedHashMap。条目,并维护条目前后的引用

这是正确的,LinkedHashMap。条目扩展了HashMap。条目,但通过存储指向条目之前和之后的指针来添加链接位。

尽管LinkedHashMap图看起来要复杂得多,但它只是简单地在蓝色/红色箭头表示的之前添加,在之后添加

†LinkedHashMap除了作为构造函数参数的插入顺序外,还支持访问顺序(排序模式)。如果flag设置为true,则在列表中迭代将按元素访问的顺序返回元素,而不是按元素插入的顺序返回。

来自JavaArticles的图片。

 类似资料:
  • 本文向大家介绍详解 Java HashMap 实现原理,包括了详解 Java HashMap 实现原理的使用技巧和注意事项,需要的朋友参考一下 HashMap 是 Java 中最常见数据结构之一,它能够在 O(1) 时间复杂度存储键值对和根据键值读取值操作。本文将分析其内部实现原理(基于 jdk1.8.0_231)。  数据结构 HashMap 是基于哈希值的一种映射,所谓映射,即可以根据 key

  • 本文向大家介绍Java中的引用和动态代理的实现详解,包括了Java中的引用和动态代理的实现详解的使用技巧和注意事项,需要的朋友参考一下 我们知道,动态代理(这里指JDK的动态代理)与静态代理的区别在于,其真实的代理类是动态生成的。但具体是怎么生成,生成的代理类包含了哪些内容,以什么形式存在,它为什么一定要以接口为基础? 如果去看动态代理的源代码(java.lang.reflect.Proxy),会

  • 本文向大家介绍Java LinkedList的实现原理图文详解,包括了Java LinkedList的实现原理图文详解的使用技巧和注意事项,需要的朋友参考一下 一、概述 先来看看源码中的这一段注释,我们先尝试从中提取一些信息: Doubly-linked list implementation of the List and Deque interfaces. Implements all opt

  • 本文向大家介绍详解Java回调的原理与实现,包括了详解Java回调的原理与实现的使用技巧和注意事项,需要的朋友参考一下 回调原本应该是一个非常简单的概念,但是可能因为平时只用系统为我们写好的回调的接口了,自己很少实现回调,所以在自己实现回调的时候还是有一点点晕的,现在写这篇文章记录一下,也和大家分享一下怎么写回调接口。 回调 回调的概念:举个例子就是,我们想要问别人一道题,我们把题跟对方说了一下,

  • 本文向大家介绍java中多态概念、实现原理详解,包括了java中多态概念、实现原理详解的使用技巧和注意事项,需要的朋友参考一下 一.什么是多态? 1.多态的定义 指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式(发送消息就是函数调用) 2.多态的作用 消除类型之间的耦合关系 3.多态的说明 近代网络小说泛滥,我们可以用它来举一个例子 某日你看见你手机上

  • 在使用Kafka Streams的处理器API时,我使用了如下内容: 实际上,我在这里做的是每分钟从状态存储发送一个状态到下沉(在init()方法中使用context.schedule())。我不明白的是: 我向前发送的[Key,Value]对,然后执行commit(),从状态存储中获取。它是根据我的特定逻辑从许多非连续输入[键,值]对中聚合的。每个这样的输出[键,值]对都是来自输入的几个非有序[