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

news2024/9/22 22:34:24

在这里插入图片描述

  咦咦咦,各位小可爱,我是你们的好伙伴——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电子书籍、简历模板等海量资料。


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

操作系统虚拟内存(下)

操作系统虚拟内存&#xff08;上&#xff09;-CSDN博客 TLB 多级页表虽然解决了空间上的问题&#xff0c;但是虚拟地址到物理地址的转换就多了几道转换的工序&#xff0c;这显然就降低了这俩地址转换的速度&#xff0c;也就是带来了时间上的开销。 程序是有局部性的&#xff…

使用备份工具xtrabackup完成数据库的备份与恢复

安装备份工具xtrabackup 简介 它是开源免费的支持MySQL 数据库热备份的软件&#xff0c;它能对InnoDB和XtraDB存储引擎的数据库非阻塞地备份。它不暂停服务创建Innodb热备份&#xff1b; 为mysql做增量备份&#xff1b;在mysql服务器之间做在线表迁移&#xff1b;使创建replica…

跟着pink老师前端入门教程(JavaScript)-day05

六、语句 &#xff08;一&#xff09;表达式和语句 1、表达式 表达式是可以被求值的代码&#xff0c;JavaScript 引擎会将其计算出一个结果。 2、语句 语句是一段可以执行的代码。 比如&#xff1a; prompt() 可以弹出一个输入框&#xff0c;还有 if语句 for 循环语句等…

华为OD机试真题-用连续自然数之和来表达整数-2023年OD统一考试(C卷)---python代码免费

题目&#xff1a; 代码 """ 题目分析&#xff1a; 一个整数 连续的自然数之和表示(非负整数&#xff09;输入&#xff1a; 一个整数T[1,1000] 输出&#xff1a; 输出多个表达式&#xff0c;自然数个数最少优先输出 最后一行&#xff0c; 输出“Result : 个数…

【监督学习之线性回归】

曾梦想执剑走天涯&#xff0c;我是程序猿【AK】 目录 简述概要知识图谱 简述概要 了解什么是线性回归 知识图谱 监督学习中的线性回归是一种预测模型&#xff0c;它试图通过拟合一个线性方程来建立输入变量&#xff08;特征&#xff09;和输出变量&#xff08;目标值&#x…

JAVA实现数据导出到excel文件

开始 1. 需要引入依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.2</version></dependency> 2. 核心代码 // 创建一个工作簿&#xff0c;也就是Excel文件 HSSFWorkb…

bat判断vmware 是否已安装

要通过批处理脚本&#xff08;.bat&#xff09;判断VMware是否已安装&#xff0c;您可以尝试以下方法&#xff1a; 检查VMware的进程 您可以检查VMware相关的进程是否在运行。例如&#xff0c;VMware Workstation的进程名通常是vmware-workstation.exe。 echo off tasklist /…

微信小程序开发学习笔记——2.8媒体组件image的src三种引入方式

>>跟着b站up主“咸虾米_”学习微信小程序开发中&#xff0c;把学习记录存到这方便后续查找。 课程连接&#xff1a; https://www.bilibili.com/video/BV19G4y1K74d?p11 image&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/component/image.html 一…

基于springboot+vue的服装生产管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

【Chrono Engine学习总结】4-vehicle-4.3-两个vehicle碰撞测试

由于Chrono的官方教程在一些细节方面解释的并不清楚&#xff0c;自己做了一些尝试&#xff0c;做学习总结。 今天突发奇想&#xff0c;想试一下&#xff0c;是否可以实现两个vehicle的碰撞&#xff1f; 1、两辆vehicle的仿真 官方提供了demo_VEH_TwoCars这个demo&#xff0c…

「C#」WPF学习笔记-基础类及继承关系

1、DependencyObject DependencyObject是WPF中依赖属性系统的核心&#xff0c;它为WPF的数据绑定、动画和属性共享等功能提供了支持&#xff0c;是一个非常重要的基类。 其主要特点和职责包括&#xff1a; 依赖属性系统&#xff1a;DependencyObject 是所有支持依赖属性的类…

js设计模式:观察者模式

作用: 和发布订阅模式基本类似。 当某一对象状态发生变化时,所有的观察者都会收到通知。 vue响应式原理就是很经典的案例,数据发生变化,通知各个依赖。 示例: class TaobaoShop{constructor(){this.list []}addSub(name,data){this.list.push({name,data})}pubUser(name,d…

Web3 基金会推出去中心化之声计划:投入高额 DOT 和 KSM ,助力去中心化治理

作者&#xff1a;Web3 Foundation Team 编译&#xff1a;OneBlock 原文&#xff1a;https://medium.com/web3foundation/decentralized-voices-program-93623c27ae43 Web3 基金会为 Polkadot 和 Kusama 创建了去中心化之声计划&#xff08;Decentralized Voices Program&…

【Java多线程】分析线程加锁导致的死锁问题以及解决方案

目录 1、线程加锁 2、死锁问题的三种经典场景 2.1、一个线程一把锁 2.2、两个线程两把锁 2.3、N个线程M把锁&#xff08;哲学家就餐问题&#xff09; 3、解决死锁问题 1、线程加锁 其中 locker 可以是任意对象&#xff0c;进入 synchronized 修饰的代码块, 相当于加锁&…

亚信安慧AntDB数据库为实时流数据构筑坚实防线

在数字化浪潮中&#xff0c;企业对实时流数据处理的依赖日益增强。在此背景下&#xff0c;AntDB数据库应运而生&#xff0c;提供一种创新性解决方案&#xff0c;专注于解决实时流数据处理中的数据容灾和一致性问题。AntDB的设计理念是确保在处理高吞吐量的流数据时&#xff0c;…

web前端安全性——CSRF跨站请求伪造

承接上篇讲述的XSS跨站脚本攻击 跨站请求伪造&#xff08;CSRF&#xff09; 1、概念 CSRF(Cross-site request forgery) 跨站请求伪造:攻击者诱导受害者进入第三方网站&#xff0c;在第三方网站中&#xff0c;向被攻击网站发送跨站请求。利用受害者在被攻击网站已经获取的注…

【Git】:标签功能

标签功能 一.标签操作二.推送远程标签 标签 tag &#xff0c;可以简单的理解为是对某次commit的⼀个标识&#xff0c;相当于起了⼀个别名。例如&#xff0c;在项⽬发布某个版本的时候&#xff0c;针对最后⼀次commit起⼀个v1.0这样的标签来标识⾥程碑的意义。这有什么⽤呢&…

代码随想录算法训练营第21天—回溯算法01 | ● 理论基础 ● *77. 组合

理论基础 回溯是一种纯暴力搜索的方法&#xff0c;它和递归相辅相成&#xff0c;通常是执行完递归之后紧接着执行回溯相较于以往使用的for循环暴力搜索&#xff0c;回溯能解决更为复杂的问题&#xff0c;如以下的应用场景应用场景 组合问题 如一个集合{1,2,3,4}&#xff0c;找…

【讨论】Web端测试和App端测试的不同,如何说得更有新意?

Web 端测试和 App 端测试是针对不同平台的上的应用进行测试&#xff0c;Web应用和App端的应用实现方式不同&#xff0c;测试时的侧重点也不一样。 Web端应用和App端应用的区别&#xff1a; 平台兼容性 安装方式 功能和性能 用户体验 更新和维护 测试侧重点有何不同 平台…

springboot208基于springboot物流管理系统

基于spring boot物流管理系统设计与实现 摘 要 社会发展日新月异&#xff0c;用计算机应用实现数据管理功能已经算是很完善的了&#xff0c;但是随着移动互联网的到来&#xff0c;处理信息不再受制于地理位置的限制&#xff0c;处理信息及时高效&#xff0c;备受人们的喜爱。…