22. LinkedHashMap和HashMap有什么区别?为什么LinkedHashMap能保持元素的插入顺序?

LinkedHashMapHashMap 都是 Java 中用于存储键值对的集合类,但它们在一些关键特性上有所不同,尤其是在元素的顺序和性能方面。以下是它们之间的主要区别:

1. 元素的顺序

  • HashMap:

    • HashMap不保证元素的顺序。元素的顺序可能会在插入、删除或扩容时发生变化。

    • 这是因为HashMap是基于哈希表实现的,元素的顺序完全依赖于哈希码和哈希函数。

  • LinkedHashMap:

    • LinkedHashMap保持元素的插入顺序,或者按照访问顺序(如果设置为访问顺序模式)排列。

    • 这是因为LinkedHashMap在内部维护了一个双向链表,该链表链接着所有的键值对,从而记录了元素的插入顺序或访问顺序。

2. 内部数据结构

  • HashMap:

    • HashMap使用哈希表来存储数据。每个元素的位置由其键的哈希码决定,元素存储在桶(bucket)数组中,多个元素可能映射到同一个桶(哈希碰撞)时,会形成链表或红黑树。

  • LinkedHashMap:

    • LinkedHashMap继承自HashMap,在内部使用了与HashMap相同的哈希表结构,但在每个键值对上附加了一个双向链表。这条双向链表按插入顺序或访问顺序链接所有的键值对,确保元素的顺序性。

3. 性能

  • HashMap:

    • HashMap通常比LinkedHashMap稍快,特别是在不需要维护顺序的情况下,因为HashMap不需要额外维护链表结构。

  • LinkedHashMap:

    • LinkedHashMap由于维护了双向链表,在插入和删除元素时的开销比HashMap略高。尽管如此,在常见操作(如查找)中的性能差异通常是微乎其微的,因为它们都继承了HashMap的哈希表结构。

4. 内存消耗

  • HashMap:

    • HashMap只需要维护哈希表,不需要额外的链表结构,因此在内存消耗上更为紧凑。

  • LinkedHashMap:

    • LinkedHashMap由于需要维护额外的双向链表结构,因此每个节点都会占用更多的内存空间。

5. 访问顺序模式

  • LinkedHashMap:

    • LinkedHashMap提供了一个特殊的构造方法,可以让它按照访问顺序来排列元素。如果设置了此模式,每次访问(包括get()put()操作)都会将该元素移动到双向链表的末尾,从而反映最近访问的顺序。

    • 默认情况下,LinkedHashMap保持插入顺序,但通过将accessOrder参数设置为true,可以将其切换为访问顺序模式。

为什么LinkedHashMap能保持元素的插入顺序?

LinkedHashMap之所以能够保持元素的插入顺序,关键在于它内部维护的双向链表。具体机制如下:

  • 双向链表:

    • LinkedHashMap在每个节点(即键值对)中增加了两个指针,分别指向前一个节点和后一个节点。这些节点构成了一个双向链表。

    • 当新的元素被插入时,它会被添加到链表的尾部,保持插入顺序。

  • 遍历顺序:

    • 当你遍历LinkedHashMap时,它按照双向链表的顺序返回元素。这确保了遍历时的顺序与插入顺序一致。

  • 访问顺序模式:

    • 如果LinkedHashMap配置为按访问顺序排列,最近访问的元素会被移到链表的末尾。这种模式下,遍历的顺序反映了元素的最近使用情况。

示例代码

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
​
public class MapExample {public static void main(String[] args) {Map<String, String> hashMap = new HashMap<>();hashMap.put("one", "1");hashMap.put("two", "2");hashMap.put("three", "3");System.out.println("HashMap: " + hashMap); // 输出顺序不定
​Map<String, String> linkedHashMap = new LinkedHashMap<>();linkedHashMap.put("one", "1");linkedHashMap.put("two", "2");linkedHashMap.put("three", "3");System.out.println("LinkedHashMap: " + linkedHashMap); // 输出顺序为插入顺序}
}

总结

  • HashMap: 不保证顺序,性能稍好,内存占用较少,适合对顺序不敏感的场景。

  • LinkedHashMap: 保持插入顺序或访问顺序,内存开销较大,适合需要顺序性和快速查找的场景。

根据具体需求选择使用HashMapLinkedHashMap可以更好地优化代码的性能和行为。

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

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

相关文章

453.最小操作次数使数组元素相等

453.最小操作次数使数组元素相等 给你一个长度为 n 的整数数组&#xff0c;每次操作将会使 n - 1 个元素增加 1 。返回让数组所有元素相等的最小操作次数。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;3 解释&#xff1a; 只需要3次操作&#xff08;…

全国设计院排名 境外工程项目管理营业额二〇二三年排名

境外工程项目管理营业额二〇二三年排名 单位&#xff1a;万元人民币 序号 公 司 名 称 营业额 1 中国铁路设计集团有限公司 37,515 2 中冶南方工程技术有限公司 12,453 3 中国恩菲工程技术有限公司 8,940 4 中冶华天工程技术有限公司 7,646 5 中国电建集团华东…

为什么echarts极坐标柱形图的图形显示的特别小呢??如何解决??

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

最新Vmware17的WIn10虚拟机开箱即用,免安装

这篇文章分享的Vmware安装Win10的教程&#xff0c;如过有些懒得装Win10的同学可以会直接使用我的WIn10镜像压缩包打开即可 Win10镜像压缩包下载 tips&#xff1a;⬆️⬆️包含Vmware17安装包 使用方法&#xff0c;打开Vmware

皕盛电商平台:为合作伙伴提供广阔的发展空间

随着互联网的快速发展&#xff0c;我国电商行业已经取得了显著的成果&#xff0c;越来越多的企业和个人投身于电商领域。在众多电商平台中&#xff0c;皕盛电商平台以其独特的方式&#xff0c;为消费者、商家和合作伙伴创造了一个全新的电商生态圈。 一、关于皕盛电商平台 皕…

Redis集群搭建以及用idea连接集群

一、redis的集群搭建&#xff1a; 判断一个是集群中的节点是否可用,是集群中的所用主节点选举过程,如果半数以上的节点认为当前节点挂掉,那么当前节点就是挂掉了,所以搭建redis集群时建议节点数最好为奇数&#xff0c;搭建集群至少需要三个主节点,三个从节点,至少需要6个节点。…

零基础学习Redis(7) -- hash类型命令使用

Redis本身就是通过哈希表的方式组织数据&#xff0c;同时redis中的value也可以是另一个哈希表。 1. 常用命令 1. hset / hsetnx hset key filed1 value1 filed2 value2 ... hset 用于把键值对存入value中&#xff0c;这里的key为redis组织的键&#xff0c; filed1 value1 fil…

JavaWeb笔记整理10——JWT令牌、Filter、Interceptor

目录 1.简介 2.生成和校验 3.登录-生成令牌 4.过滤器Filter 快速入门 Filter执行流程 Filter拦截路径 过滤器链 登录校验Filter 流程 代码 5.拦截器Interceptor 快速入门 Interceptor拦截路径 执行流程 代码 继笔记04-session cookie 1.简介 2.生成和校验 /*…

【秋招笔试】8.31京东秋招(研发岗)-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收…

计算机毕业设计选题推荐-摇滚音乐鉴赏网站-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

滑动窗口系列(定长滑动窗口长度) 8/30

1.所有数对中 数位差之和() 题意&#xff1a; 给定一个nums数组&#xff0c;计算中所有整数数对中 数位差的个数之和&#xff1b; 数位差&#xff1a;某一位上的数字不一样就记作数位差。 eg:12 22; 十位上不一样&#xff0c;数位差为1 思路&#xff1a; 首先计算出一个数…

Linux信号处理机制基础

什么是信号 信号在最早的UNIX系统中即被引入&#xff0c;已有30多年的历史&#xff0c;但只有很小的变化。信号是提供异步事件处理机制的软件中断。进程之间可以相互发送信号&#xff0c;这使信号成为一种进程间通信(Inter-ProcessCommunication,lPC)的基本手段 信号的名称与…

splunk Enterprise 的HTTP收集器-windows

1.创建HTTP收集器 2.使用HTTP收集器 然后打开全局设置&#xff1a;把ssl给去掉&#xff0c;点保存&#xff08;保存之后&#xff0c;可以看到这些状态全部都是已启用了&#xff09;&#xff1a; 3.测试&#xff1a; curl --location --request POST http://192.168.11.131:808…

【自动驾驶】决策规划算法概述

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

卷积神经网络(CNN):算法、原理与应用

卷积神经网络&#xff08;Convolutional Neural Networks, CNN&#xff09;是深度学习领域中的重要算法之一&#xff0c;尤其在计算机视觉任务中表现出色。本文将从基础原理、核心组件、以及应用场景三个方面理解卷积神经网络的强大之处。 卷积神经网络的基本概念 卷积神经网…

u盘pe怎么安装系统_u盘pe安装系统详细步骤

u盘pe怎么安装系统&#xff1f;u盘pe安装系统需要准备一个u盘&#xff0c;然后将u盘制作成pe&#xff0c;进入pe后再安装系统&#xff0c;下面小编就教大家u盘pe安装系统详细步骤教程。 u盘pe启动盘是什么&#xff1f; u盘pe启动盘是一种可引导的USB存储设备&#xff0c;其中包…

10:Logic软件原理图中添加电源与GND

Logic软件原理图中添加电源与GND

Hive的存储格式

文章目录 Hive的存储格式1.存储格式简介2.行存储与列存储行式存储列式存储混合的 PAX 存储结构 TextFileSequenceFile Hive的存储格式 1.存储格式简介 Hive支持的存储数的格式主要有&#xff1a;TEXTFILE(默认格式) 、SEQUENCEFILE、RCFILE、ORCFILE、PARQUET。 textfile为默…

续:docker 仓库数据传输加密

上一个实验&#xff1a;非加密的形式在企业中是不被允许的。 示例&#xff1a;【为Registry 提供加密传输】 因为传输也是https&#xff0c;所以与ssh一样的加密。 ## 这种方式就不用写这个了。 [rootdocker ~]# cat /etc/docker/daemon.json #{ # "insecure-registrie…

7个流行的开源数据治理工具

数字化时代&#xff0c;数据是已经成为最宝贵的资产之一。数据支撑着我们的政府、企业以及各类组织的所有流程&#xff0c;并为决策以及智能化服务提供支撑。大数据有大用途&#xff0c;但是也可能隐藏着巨大的风险&#xff0c;特别是如果我们对数据的情况不是很了解的时候&…