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

举报
bug菌 发表于 2024/03/18 13:38:03 2024/03/18
【摘要】 🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!!

在这里插入图片描述

  咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~

在这里插入图片描述


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

环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8

@[toc]

前言

  Java是一种面向对象的编程语言,集合类是在Java编程中常用的一种数据结构,包括数组和集合。在Java中,集合类可以用来存储和操作一组对象数据,是Java编程中不可或缺的一部分。在本文中,我们将详细介绍Java中一个常用的集合类:LinkedHashMap。

摘要

  本文将重点介绍LinkedHashMap这一集合类的应用和实践。我们将从源代码解析开始,详细介绍LinkedHashMap的实现方式和内部结构。接着,我们将通过实际应用场景案例和优缺点分析,深入剖析LinkedHashMap的特点和适用范围。最后,我们将给出LinkedHashMap类的代码和方法介绍,并提供测试用例,让读者更好地掌握该类的使用方法。

LinkedHashMap

简介

  LinkedHashMap是Java中常用的一种Map集合类,它基于哈希表和链表实现,可以保证存储和取出元素的顺序是相同的。与HashMap不同的是,LinkedHashMap还维护了一个双向链表,用于记录元素插入的顺序。

源代码解析

  LinkedHashMap继承了HashMap类,因此它的底层结构也是基于哈希表实现的。不同的是,在LinkedHashMap中,每个元素还有两个指针:一个指向前驱元素,一个指向后继元素。这样就可以通过这些指针来维护元素的插入顺序。

  在LinkedHashMap中,元素插入时会先在哈希表中寻找元素所在的位置,然后再将该元素插入到双向链表的尾部。因此,在遍历LinkedHashMap时,元素的顺序就是插入的顺序。

  LinkedHashMap是一个基于HashMap实现的有序哈希表,它维护着一个双向链表来保证元素的顺序。在遍历时,LinkedHashMap可以按照插入顺序或者访问顺序进行遍历。

  LinkedHashMap的源代码解析:

  内部类Entry继承自HashMap中的静态内部类Node,用于表示链表节点

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);
    }
}

代码解析:

这段代码定义了一个泛型静态类 Entry,它继承了 HashMap.Node 类。Entry 类有四个属性:

  1. int 类型的 hash,用于存储键的哈希值;

  2. K 类型的 key,用于存储键对象;

  3. V 类型的 value,用于存储值对象;

  4. Node<K,V> 类型的 next,用于存储下一个节点。

除此之外,Entry 类还有两个指向前后节点的引用 before 和 after。这些引用被用于实现链表结构,以便在发生冲突(即哈希冲突)的时候用于维护桶中的节点链表。

Entry 类的构造函数接受四个参数,分别是哈希值、键对象、值对象和下一个节点。当创建一个新节点时,这些参数会被传递给构造函数以初始化节点的属性。

  如下是部分源码截图:

在这里插入图片描述

应用场景案例

  LinkedHashMap适用于需要按照插入顺序或者访问顺序来遍历元素的场景。比如,一个缓存系统中,当缓存到达容量上限时,需要删除最近最少使用的元素,这就可以通过LinkedHashMap的访问顺序来实现。

  另一个应用场景是把元素插入到集合中后再执行删除操作,此时可以通过LinkedHashMap的插入顺序来精确控制删除的顺序。

优缺点分析

LinkedHashMap的优点在于它能保证元素的顺序,而且在访问元素时比HashMap效率更高。另外,LinkedHashMap还可以指定元素访问顺序(按照访问时间,从最近访问的元素开始遍历)。

  缺点在于,由于维护了双向链表,LinkedHashMap的空间占用比HashMap更大。此外,LinkedHashMap的插入和删除操作比HashMap慢一些。

类代码方法介绍

以下是LinkedHashMap类的主要方法:

  • put(Object key, Object value):将键值对插入到LinkedHashMap中。
  • get(Object key):根据键获取对应的值。
  • remove(Object key):根据键删除元素。
  • clear():清空所有元素。
  • size():返回元素个数。
  • entrySet():返回LinkedHashMap中所有元素的Set视图。

代码分析:

  该段代码并没有实现LinkedHashMap类的主要方法,只是列出了该类的主要方法的名称和作用。下面对每个方法的作用进行简单的解释:

  • put(Object key, Object value):将给定的键值对插入到LinkedHashMap中。
  • get(Object key):根据给定的键获取对应的值。
  • remove(Object key):根据给定的键删除对应的元素。
  • clear():清空LinkedHashMap中的所有元素。
  • size():返回LinkedHashMap中元素的个数。
  • entrySet():返回LinkedHashMap中所有元素的Set视图,即一个包含所有元素的Set对象。

测试用例

  以下是一个简单的LinkedHashMap测试用例,使用put方法将元素插入到集合中,然后使用entrySet方法遍历所有元素,并输出元素的键和值:

package com.demo.javase.day68;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * @Author bug菌
 * @Date 2023-11-06 12:30
 */
public class LinkedHashMapTest {

    public static void main(String[] args) {
        LinkedHashMap<Integer, String> linkedHashMap = new LinkedHashMap<>();
        linkedHashMap.put(1, "apple");
        linkedHashMap.put(4, "banana");
        linkedHashMap.put(2, "orange");
        linkedHashMap.put(3, "pear");

        for (Map.Entry<Integer, String> entry : linkedHashMap.entrySet()) {
            System.out.println("key: " + entry.getKey() + ", value: " + entry.getValue());
        }
    }
}

测试结果

  根据如上测试用例,本地测试结果如下,仅供参考,你们也可以自行修改测试用例或者添加更多的测试数据或测试方法,进行熟练学习以此加深理解。

输出结果如下:

key: 1, value: apple
key: 4, value: banana
key: 2, value: orange
key: 3, value: pear

在这里插入图片描述

测试代码分析

  根据如上测试用例,在此我给大家进行深入详细的解读一下测试代码,以便于更多的同学能够理解并加深印象。

  这段代码演示了如何使用Java中的LinkedHashMap类。LinkedHashMap是HashMap类的子类,它在HashMap的基础上维护了一个双向链表,因此可以按照插入顺序遍历元素。

  在main方法中,我们首先创建了一个LinkedHashMap对象linkedHashMap,并向其中插入了4个键值对。然后使用for循环遍历linkedHashMap中的每一个元素,并输出其键和值。由于LinkedHashMap会按照插入顺序维护链表,因此遍历的顺序与插入顺序相同。

  最终的输出结果为:

key: 1, value: apple
key: 4, value: banana
key: 2, value: orange
key: 3, value: pear

小结

  本文介绍了Java中常用的一种Map集合类:LinkedHashMap。我们从源代码解析开始,详细介绍了它的实现方式和内部结构。接着,我们通过实际应用场景案例和优缺点分析,深入剖析了LinkedHashMap的特点和适用范围。最后,我们给出了LinkedHashMap类的方法介绍和测试用例,希望读者能够更好地掌握LinkedHashMap的使用方法。

总结

  LinkedHashMap是Java中常用的一种Map集合类,它能够按照插入顺序或者访问顺序来遍历元素,适用于需要精确控制元素顺序的场景。虽然LinkedHashMap的空间占用比HashMap更大,但它在访问元素时比HashMap效率更高,同时还可以指定元素访问顺序(按照访问时间)。

  总之,LinkedHashMap是Java编程中一个非常实用的集合类,可以帮助我们更好地管理和操作一组对象数据。在实际应用中,我们要根据具体需求选择不同的集合类,以达到最佳的性能和效率。

  …
  好啦,这期的内容就基本接近尾声啦,若你想学习更多,可以参考这篇专栏总结《「滚雪球学Java」教程导航帖》,本专栏致力打造最硬核 Java 零基础系列学习内容,🚀打造全网精品硬核专栏,带你直线超车;欢迎大家订阅持续学习。

附录源码

  如上涉及所有源码均已上传同步在「Gitee」,提供给同学们一对一参考学习,辅助你更迅速的掌握。

☀️建议/推荐你


  无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学Java」,bug菌郑重承诺,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门Java编程,就像滚雪球一样,越滚越大,指数级提升。

  最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。

  同时欢迎大家关注公众号:「猿圈奇妙屋」 ,以便学习更多同类型的技术文章,免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板、技术文章Markdown文档等海量资料。

📣关于我

  我是bug菌,CSDN | 掘金 | infoQ | 51CTO 等社区博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,华为云 | 阿里云| 腾讯云等社区优质创作者,全网粉丝合计15w+ ;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等海量资料。


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。