Java常见集合类三(Map,HashMap put 方法详解)

一、Map 接口概述

Map 中存放键值对的 key 是唯一的,value 是可以重复的;

Map 中的 key 可以全部分离出来,存储到 Set 中来进行访问 (因为 key 不能重复);

Map 中的 value 也可以全部分离出来,存储在 Collection 的任何一个子集合中 ( value 可能有重复);

Map中键值对的 key不能直接修改,value 可以修改,如果要修改 key,只能先将该 key 删除掉,然后再来进行重新插入。 

Map 接口常用方法:

 二、Map.Entry<K, V>

Map.Entry 是 Map 内部实现的用来存放键值对映射关系的内部类(实际是接口),该内部类中主要提供了<key, value> 的获取,value 的设置以及 key 的比较方式。方法为:

三、HashMap

HashMap 中的 key 和 value 都可以为空,key 不能重复,是线程不安全的。

底层数据结构:数组 + 链表 / 红黑树

常用构造方法:

1. 构造一个空的 HashMap 对象,初始容量为16,加载因子为 0.75;

2. 构造一个空的 HashMap 对象,初始容量为指定的容量(第一个大于指定容量的二次幂),加载因子为 0.75;

4. 构造一个包含实现了 Map 接口的子类的 HashMap 对象;

HashMap 使用懒加载,在进行第一次 put 操作时才会初始化 table(在没有进行 put 操作的时候 table 为 null );

常用其他方法:

1. put(K key, V value):存放 key,value 键值对;

1)首先根据 hash() 方法计算 key 对应的 hash值;

2)调用 putVal() 方法来进行插入;

a. 首先会判断 table 是否为空(第一次 put 的时候),通过resize() 方法来进行初始化;默认容量大小为16,加载因子为 0.75;即当 table 中的数据达到此时的最大容量 16 * 0.75 = 12 时,会触发扩容机制,默认扩容为原来最大容量的 2 倍;

b. 判断是否产生冲突,根据由 key 计算的 hash 值在 node 数组中对应位置是否有元素来判断;

1. 如果没有元素,则直接在创建一个新的节点存放在 node 数组中;

2. 如果有元素,判断 key 计算的 hash 以及 通过 == 判断或者 equals 判断 key 是否都相等(与 table数组索引位置处的值判断);如果相等说明此时插入的 key 是重复的,替换掉原来的 value;

3. 如果经过 2 判断不成立,此时会判断当前数组位置上对应的节点类型是否为 TreeNode(即判断当前链表是否已经树化),如果已经树化了,则按照红黑树的插入执行; 

4. 经 3 判断过之后,说明此时链表还没有树化,则会遍历该数组位置上的链表,

a:判断链表上的每个节点和当前要插入的节点的 key 算出的 hash 值是否相等,

b:并且 key 相等或者通过 equals 判断相等,如果都判断相等,则跳出循环,不再添加新节点(对应第二个 if 判断);

否则(对应第一个 if 判断),会创建一个新的节点(将其key,value等值赋值到新节点上)插入到链表的最后;插入完成后,判断是否达到树化的条件(数组长度大于等于 64 并且某一条链表的长度大于等于 8),若满足条件,则进行树化;

最后的 if 判断,进行 value 值的替换。

c. 最后插入完成后,判断是否达到了扩容的条件(table 中的总数据量达到临界值即 最大容量 * 加载因子),来决定是否需要进行扩容(通过 resize 方法扩容);

2. get(K key):根据 key 获取 value

通过调用 getNode 方法实现

1)首先判断 table 数组不为空,并且 table 数组的长度 不为 0,并且通过 hash 算法计算出 key 在table 表中的位置不为空,若不满足以上条件,则直接返回 null,也就是说 key 是不存在的;(对应第一个 if )

2)满足 1 之后,(对应第二个 if )

a:判断该 key 的hash值与  key 在 table 数组中对应位置的链表的第一个元素计算的 hash值  是否相等,

b: 通过 == 判断的 key 相等 或者 通过 equals 方法判断相等,

若满足 a 和 b,则说明该 table 数组位置上的链表的第一个节点就是要查询的节点;

3)不满足 2 之后,判断 这个链表的下一个节点是否为空,(对应第三个 if )

a:如果为空,说明链表只有一个节点并且不满足,则返回空,

b:如果不为空,判断其类型是否为 TreeNode,即判断是否已经树化(对应第四个 if ),若树化,则按照红黑树的方式进行查询,如果不为 TreeNode,则循环判断该链表上的每个节点是否满足 2 的条件,若满足则返回该节点,否则,一直判断直到该节点为 null;

3. containsKey(Object key)(通过getNode 方法判断)

4. 其他常用方法在 Map 接口常用方法 中;

四、TreeMap 

TreeMap 中的 key 不可以为空,value 可以为 null,key 不能重复,是线程不安全的。

底层使用红黑树,查询的时间复杂度为 O (logn)

常用构造方法:

1. 创建一个空的 TreeMap 对象,使用其 key 的自然排序规则排序;

2. 创建一个空的 TreeMap 对象,使用指定的比较器进行排序;

3. 创建一个TreeMap 对象,其包含一个实现了 Map 接口的类的对象,使用 key 的自然排序规则排序;

其他常用方法:

1. Comparator<? super K> comparator():返回该映射中用于排序的比较器对象,若使用自然排序则返回 null;

2. 其他常用方法在 Map 接口常用方法 中;

五、HashMap 和 TreeMap 区别

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

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

相关文章

中文金融大语言模型:专业、智能、全面,一站式金融解决方案,你的专属LLM金融顾问

中文金融大语言模型&#xff1a;专业、智能、全面&#xff0c;一站式金融解决方案&#xff0c;你的专属LLM金融顾问 DISC-FinLLM 是一个专门针对金融场景下为用户提供专业、智能、全面的金融咨询服务的金融领域大模型&#xff0c; 资料下载&#xff1a;https://download.csdn.…

TTime:截图翻译/OCR

日常网页翻译Translate Web Pages完全足够&#xff0c;TTime最重要的功能&#xff0c;还是截图翻译&#xff0c;还有个厉害的功能&#xff0c;就是静默OCR&#xff0c;相比之前的分享的识字精灵效率更高。 软件使用 打开软件&#xff0c;点击翻译源设置&#xff0c;建议勾选一…

第十三期Big Demo Day亮点项目:CCarbon重塑碳交易生态,助力全球绿色发展

第十三期Big Demo Day活动即将于2024年5月28日在香港数码港的CyberArena隆重举行。我们荣幸地宣布&#xff0c;利用区块链技术优化全球碳交易CCarbon项目将亮相&#xff0c;参与精彩的项目路演。本次活动由ZeeprLabs、BiKing Exchange、Gather冠名赞助&#xff0c;Central Rese…

DOS学习-目录与文件应用操作经典案例-ren

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一.前言 二.使用 三.案例 案例 1&#xff1a;重命名当前目录下的文件 案例 2&#xff1a…

超清高帧,成像升级 | SWIR短波红外相机500万像素992芯片

博图光电5MP短波红外相机&#xff0c;搭载了索尼IMX992 SenSWIR传感器&#xff0c;支持5.2MP分辨率&#xff0c;适合探测波长在400nm-1700nm波段的可见光和短波红外光&#xff0c;有效面积和透光率得到提升&#xff0c;内置TEC制冷片&#xff0c;实现了像素尺寸和图像均匀性方面…

网络实时安全:构筑数字时代的铜墙铁壁

什么是网络实时安全&#xff1f; 网络实时安全&#xff0c;简而言之&#xff0c;是一种能够在威胁发生的瞬间即刻识别、响应并有效抵御的安全机制。它强调的是速度与效率&#xff0c;确保网络环境能够持续处于安全状态。这背后&#xff0c;离不开高科技的支撑——扩展检测系统…

Linux源码编译安装MySQL + Qt连接MySQL

一、准备工作 1. 编译环境&#xff1a; 银河麒麟V10 飞腾D2000 CPU 2. 下载MySQL源码 这里编译的是5.7.44版本&#xff0c;带Boost库&#xff0c;这是官网的下载地址&#xff1a;MySQL :: Download MySQL Community Server (Archived Versions) 3. 解压压缩包 tar -zxvf mys…

Python内置方法串讲:类型转化与实用技巧

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、类型转化&#xff1a;从A到B的魔法 二、实用技巧&#xff1a;避免类型错误 三、总结 一…

Datawhale团队第十一期录取名单!

Datawhale团队 公示&#xff1a;Datawhale团队成员 Datawhale成立五年了&#xff0c;从一开始的12个人&#xff0c;学习互助&#xff0c;到提议成立开源组织&#xff0c;做更多开源的事情&#xff0c;帮助更多学习者&#xff0c;也促使我们更好地成长。于是有了我们的使命&…

一年前的Java作业,模拟游戏玩家战斗

说明&#xff1a;一年前写的作业&#xff0c;感觉挺有意思的&#xff0c;将源码分享给大家。 刚开始看题也觉得很难&#xff0c;不过写着写着思路更加清晰&#xff0c;发现也没有想象中的那么难。 一、作业题目描述&#xff1a; 题目&#xff1a;模拟游戏玩家战斗 1.1 基础功…

假象和谎言

原创 | 刘教链 隔夜BTC&#xff08;比特币&#xff09;徘徊在69k一线。5.25教链内参报告&#xff0c;《BTC ETF持仓即将超越中本聪》。ETH ETF的尘嚣逐渐散去&#xff0c;复归于平静。戏刚唱了个开头&#xff0c;结尾还留着悬念。4000刀之于ETH看来是个关键阻力位&#xff0c;最…

element ui 的密码输入框点击显示隐藏密码时,图标随之改变

场景图&#xff1a; 原理&#xff1a; 通过修改el-input框的type属性&#xff0c;来设置显示或者隐藏。从而改变图标地址。 <el-input class"passwordinput" :type"pwdObj.pwdType" ref"pwdInput" placeholder"密码"v-model"…

Vue热更新出现内存溢出

Vue热更新出现内存溢出 vue-cli2遇到此问题的解决办法&#xff1a;vue-cli3遇到此问题的解决办法&#xff1a;方法一&#xff08;已测试ok&#xff09;方法二&#xff08;未尝试&#xff09; 开发项目有一段时间了&#xff0c;随着项目越来越大&#xff0c;打包的时间也相应的变…

若依微服务实现分布式事务

一、基本介绍 1、什么是分布式事务 指一次大的操作由不同的小操作组成的&#xff0c;这些小的操作分布在不同的服务器上&#xff0c;分布式事务需要保证这些小操作要么全部成功&#xff0c;要么全部失败。从本质上来说&#xff0c;分布式事务就是为了保证不同数据库的数据一致…

ssm137基于SSM框架的微博系统+vue

微博系统网站的设计与实现 摘 要 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代&#xff0c;所以对于信息的宣传和管理就…

家用洗地机哪个品牌好?家用洗地机排行榜前十名

随着洗地机逐渐进入大众视野&#xff0c;这种集吸、拖、洗功能于一体的清洁工具&#xff0c;凭借其高效便捷的特点&#xff0c;成为家庭清洁的新宠。洗地机不仅能够减少地面清洁时间&#xff0c;节省体力&#xff0c;还能提高清洁效果。然而&#xff0c;面对琳琅满目的洗地机品…

Web会话管理

一、会话管理的概念&#xff1a; 在人机交互时&#xff0c;会话管理是保持用户的整个会话活动的互动与计算机系统跟踪过程会话管理分类: 桌面会话管理、浏览器会话管理、Web服务器的会话管理。 二、为什么需要会话管理&#xff1f; HTTP是一种无状态协议&#xff0c;一次请…

java项目之智能家居系统源码(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的智能家居系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 基于Springboot的智能家居系…

【高校科研前沿】湖北工业大学为第一署名单位在《Science》发表Letters文章:应对青藏高原河流泥沙激增

文章简介 论文名称&#xff1a;Combating sediment surge in Tibetan rivers&#xff08;应对青藏高原河流泥沙激增&#xff09; 相关作者及单位&#xff1a;杨洪教授&#xff08;英国雷丁大学&#xff09;&刘德富教授&#xff08;湖北工业大学&#xff09;&Julian R…

huggingface 笔记:聊天模型

1 构建聊天 聊天模型继续聊天。传递一个对话历史给它们&#xff0c;可以简短到一个用户消息&#xff0c;然后模型会通过添加其响应来继续对话一般来说&#xff0c;更大的聊天模型除了需要更多内存外&#xff0c;运行速度也会更慢首先&#xff0c;构建一个聊天&#xff1a; ch…