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,一经查实,立即删除!

相关文章

2024 全新 Javascript 面试题目高级篇

今天是咱们Javascript面试题的高级篇&#xff0c;也是最后一篇。 20. 执行上下文、执行栈、变量对象和作用域链究竟是啥&#xff1f; 执行上下文&#xff1a;这指的是代码执行的环境&#xff0c;包括作用域、变量对象以及“this”关键字的值。每当一个函数被执行时&#xff0…

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

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

Go 高级日志记录库集成Gin框架

一、简介 Logrus是Go&#xff08;golang&#xff09;的结构化logger&#xff0c;与标准库logger完全API兼容&#xff0c;它有以下特点 结构化日志记录&#xff1a;Logrus 支持生成结构化的日志条目&#xff0c;这意味着日志不仅仅是文本字符串&#xff0c;而是包含键值对的数据…

Ceph 高级部署

一、基础环境配置 1.1 网络配置 ubuntu: network: ethernets:eno1:dhcp4: trueeno2:dhcp4: trueeno3:dhcp4: trueeno4:dhcp4: truebonds:bond0:addresses:- 100.64.0.12/22routes:- to: defaultvia: 100.64.0.1nameservers:addresses:- 114.114.114.114interfaces:- eno1- …

TTime:截图翻译/OCR

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

强化学习学习笔记-李宏毅

Policy Gradient actorenvreward function&#xff0c;env和reward是不能控制的&#xff0c;唯一可以变的是actor&#xff0c;Policy π \pi π是一个网络&#xff0c;参数为 θ \theta θ&#xff0c;输入是当前的观察&#xff0c;输出是采取的行为&#xff0c;例如游戏中输…

C++可变参技巧揭秘:从函数到模板,一网打尽

最近在用C开发项目过程中&#xff0c;遇到了场景需要用可变参&#xff08;...&#xff09;的情况&#xff0c;发现开发业务相关同事&#xff0c;对这块理解不是很清晰&#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…

自定义函数与结构体

定义一个结构体 Point&#xff0c;其中包含两个 double 类型的成员 x 和 y&#xff0c;用来表示一个二维坐标点。接着定义一个函数 dist&#xff0c;用来计算两个点之间的欧几里德距离。 在函数中&#xff0c;通过调用 hypot 函数来计算两点之间的距离&#xff0c;C 中的hypot…

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

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

OSPF不规则区域

一、OSPF不规则区域 1、远离了骨干的非骨干 2、不连续骨干 解决目的--全网可达 解决方案: 1、tunnel-- 在合法与非法 ABR 间使用 tunnel建立一个新的网段(类似连接一条独立的网线);然后将该网段宣告到ospf协议中; 缺点: 1)选路不佳 2)周期和触发信息对中间穿越区域造成影响…

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

什么是网络实时安全&#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 基础功…

清华大学 | 机器人实验室 | 机械结构 | 招聘

招聘实习生、正式工程师&#xff0c;请发送简历&#xff0c;具体工作内容、福利待遇详细沟通 基本要求 1. 熟练使用3D建模软件(如SolidWorks、CATIA、CAD等) 2. 有过机器人项目经验&#xff0c;参加过机器人相关比赛者优先 3. 具备静力学仿真经验&#xff0c;熟悉有限元分析…

假象和谎言

原创 | 刘教链 隔夜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"…