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

在这里插入图片描述

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

在这里插入图片描述


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

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

文章目录

  • 前言
  • 摘要
  • LinkedHashMap
    • 简介
    • 源代码解析
    • 应用场景案例
    • 优缺点分析
    • 类代码方法介绍
    • 测试用例
      • 测试结果
      • 测试代码分析
    • 小结
  • 总结
    • 附录源码
  • ☀️建议/推荐你
  • 📣关于我

前言

  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电子书籍、简历模板等海量资料。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/402628.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【JAVA高级面试题】运用锁机制实现一个自定义的阻塞队列

文章目录 前言实战演示写在最后 前言 前几天看见一个高级Java面试题&#xff0c;我觉得很有代表意义。既考察了面试者的基本锁机制运用&#xff0c;也了解了阻塞队列的产生实现原理。先分享出来&#xff0c;以供鉴赏。 面试题&#xff1a;实现一个自定义的阻塞队列&#xff0c…

git@github.com: Permission denied (publickey).

这个问题是使用git克隆自己的私有代码仓库时发现的&#xff0c;虚拟机中执行下面的指令生成了ssh私钥和公钥 ssh-keygen并且成功将公钥上传到了github上 但是执行git clone克隆私有仓库时依旧失败&#xff0c;报错内容和标题差不多 通过这个报错最终还是锁定了问题&#xff…

牛客网 JZ53 数字在升序数组中出现的次数

思路&#xff1a; 因为是非降序数组&#xff0c;所以可以通过二分法快速排查范围&#xff0c;等mid值找到对应k时&#xff0c;只需要往前找有多少个k和往后找有多少个k&#xff0c;计算出总数即可 答案&#xff1a; int GetNumberOfK(int* nums, int numsLen, int k ) {int…

程序员必备技能----删库跑路大总结

删库跑路大总结&#xff0c;各个都是大杀器&#xff0c;破坏性太大&#xff0c;轻易不要尝试。 删除linux根目录&#xff0c;用户目录&#xff0c;其实还可以增加一个删除/etc。删除&#xff08;清除&#xff09;数据库。删除redis缓存和持久化文件。删除mongodb库。git push …

Android 沉浸式状态栏

过时的API //设置默认隐藏虚拟按键&#xff0c;虚拟按键显示后为半透明protected open fun hideNavigationBarAndFullScreen() {val flags: Int// This work only for android 4.4flags if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {// This work only for a…

Java面向对象(四)

一、面向对象特征&#xff08;三&#xff09;---多态 父类引用指向子类的对象&#xff0c;从而产生多种形态 例&#xff1a; Animal dog new Dog(); 同一种事物&#xff0c;在不同的时刻表现不同的状态前提&#xff1a;二者存在直接或间接的继承关系时&#xff0c;/*//装狗pu…

SSH tunneling 简明示例

基本概念 SSH tunneling又称为SSH port forwarding。 如果想快速了解其应用场景&#xff0c;这篇文章A short guide to SSH port forwarding 很不错。其详细解释了Client to Server的Local Forwarding。虽然没有涉及Server to Client的Remote Forwarding&#xff0c;但他也指…

高盛:日本这轮通胀是否可持续,关键看房租

租金在日本CPI中的权重高达20%&#xff0c;高盛预计短期内租金将继续拖累通胀至1.7%或以下&#xff0c;长期有望温和上行&#xff0c;使通胀稳在2%的水平。 日本正在转向“去通缩”&#xff0c;房租能否支撑通胀态势&#xff1f; 在日股今年一路高歌、有望“收复失地”时&…

STM32 4位数码管和74HC595

4位数码管 在使用一位数码管的时候&#xff0c;会用到8个IO口&#xff0c;那如果使用4位数码管&#xff0c;难道要使用32个IO口吗&#xff1f;肯定是不行的&#xff0c;太浪费了IO口了。把四个数码管全部接一起共用8个IO口&#xff0c;然后分别给他们一个片选。所以4位数码管共…

想高薪就业鸿蒙HarmonyOS 开发岗位,到底该学习些啥?

鸿蒙是什么&#xff1f; 经过十多年的发展&#xff0c;传统移动互联网的增长红利已渐见顶。万物互联时代正在开启&#xff0c;应用的设备底座将从几十亿手机扩展到数百亿 IoT 设备。GSMA 预测到 2025 年&#xff0c;全球物联网终端连接数量将达 246 亿个&#xff0c;其中消费物…

Nginx网络服务三-----(三方模块和内置变量)

1.验证模块 需要输入用户名和密码 我们要用htpasswd这个命令&#xff0c;先安装一下httpd 生成文件和用户 修改文件 访问页面 为什么找不到页面&#xff1f; 对应的路径下&#xff0c;没有这个文件 去创建文件 去虚拟机浏览器查看 有的页面不想被别人看到&#xff0c;可以做…

电脑蓝牙在哪里打开?1分钟轻松打开蓝牙!

“我在操作电脑的时候想将电脑的蓝牙打开来连接音响和键盘&#xff0c;但是不知道电脑蓝牙应该如何打开&#xff0c;有什么比较简单的方法吗&#xff1f;” 随着无线技术的日益发展&#xff0c;蓝牙已成为连接各种设备的重要桥梁。无论是传输文件、音频还是与外部设备进行通信&…

mysql优化指南之原理篇

之前碰到一个线上问题&#xff0c;在接手一个同事的项目后&#xff0c;因为工期比较赶&#xff0c;我还没来得及了解业务背景和大致实现&#xff0c;只是了解了上线发布的顺序和验证方式就进行了上线&#xff0c;在上线进行金丝雀的时候系统还没发生什么异常&#xff0c;于是我…

独家深度 | 一文看懂 ClickHouse vs Elasticsearch:谁更胜一筹?

简介&#xff1a; 本文的主旨在于通过彻底剖析ClickHouse和Elasticsearch的内核架构&#xff0c;从原理上讲明白两者的优劣之处&#xff0c;同时会附上一份覆盖多场景的测试报告给读者作为参考。 作者&#xff1a;阿里云数据库OLAP产品部 仁劼 原文地址:https://developer.ali…

【鸿蒙 HarmonyOS 4.0】路由router

一、介绍 页面路由指在应用程序中实现不同页面之间的跳转和数据传递。HarmonyOS提供了Router模块&#xff0c;通过不同的url地址&#xff0c;可以方便地进行页面路由&#xff0c;轻松地访问不同的页面。 二、页面跳转 2.1、两种跳转模式&#xff1a; router.pushUrl()&…

为全志D1开发板移植LVGL日历控件和显示天气

利用TCP封装HTTP包请求天气信息 Linux还真是逐步熟悉中&#xff0c;现在才了解到Linux即没有原生的GUI&#xff0c;也没有应用层协议栈&#xff0c;所以要实现HTTP应用&#xff0c;必须利用TCP然后自己封装HTTP数据包。本篇即记录封装HTTP数据包&#xff0c;到心知天气请求天气…

【SiamFC】《Fully-Convolutional Siamese Networks for Object Tracking》

ECCV 2016 Workshops 文章目录 1 Background and Motivation2 Related Work3 Advantages / Contributions4 Method5 Experiments5.1 Datasets and Metrics5.2 The OTB-13 benchmark5.3 The VOT benchmarks5.4 Dataset size 6 Conclusion&#xff08;own&#xff09;/ Future wo…

JS基础之JSON对象

JS基础之JSON对象 目录 JS基础之JSON对象对象转JSON字符串JSON转JS对象 对象转JSON字符串 JSON.stringify(value,replacer,space) value:要转换的JS对象 replacer:(可选)用于过滤和转换结果的函数或数组 space:(可选)指定缩进量 // 创建JS对象 let date {name:"张三…

UE蓝图 返回结果(FunctionResult)节点和源码

系列文章目录 UE蓝图 Get节点和源码 UE蓝图 Set节点和源码 UE蓝图 Cast节点和源码 UE蓝图 分支(Branch)节点和源码 UE蓝图 入口(FunctionEntry)节点和源码 UE蓝图 返回结果(FunctionResult)节点和源码 文章目录 系列文章目录一、FunctionResult节点功能二、FunctionResult节点…

利用数字人技术“活”化吉祥物,打造“科技+”数融盛会

在第十四届全国冬季运动会上&#xff0c;吉祥物“蒙古彩娃”安达和塞努不再同于往常静态的吉祥物形象&#xff0c;而是升级为生动活泼、能够与观众实时互动的数字人形象&#xff0c;活跃于赛事宣传、场馆介绍等多个场景&#xff0c;为本届冰雪盛会注入数字活力&#xff0c;提升…