Java集合(Map篇)
一.Map
a.使用Map
i.键值(key-value)映射表的数据结构,能高效通过key快速查找value(元素)。
ii.Map是一个接口,最常用的实现类是HashMap。
iii.重复放入k-v不会有问题,但是一个key只能关联一个value。Map中不存在重复的key,因为放入相同的key,只会把原有的key-value对应的value给替换掉。

iv.实际上,V put(K key, V value)方法,如果放入的key已经存在,put()方法会返回被删除的旧value,否则,返回null。

v.在一个Map中,虽然key不能重复,但是value可以重复。

b.遍历Map
i.keySet()
1.遍历key,可以使用for each循环遍历Map的keySet()方法返回的Set集合,它包含不重复的key的集合。

ii.entrySet()
1.同时遍历key和value,可以使用for each循环遍历Map对象的entrySet()集合,它包含每一对key-value映射。

c.HashMap中key的两大作用
i.通过key相等的比较获取value,所以正确重写equals()方法。
ii.通过key计算hashCode()确定value存储的索引位置,所以正确重写hashCode()方法。
d.总结
i.Map是无序集合,遍历Map时,不可假设输出的key是有序的。
ii.Map是一种映射表,可以根据key快速查找value。
iii.最常用的一种Map实现时HashMap。
hashCode方法
a.HashMap之所以能根据key快速查找value,原因是它内部通过空间换时间的方法,用一个大数组存储所有的value,并根据key直接计算出value应该存储在哪个索引。


b.在Map内部,对key的比较是通过equals()实现的,所以存,取的key不一定是同一个对象,只要内容相同就可以。这点和List查找元素需要正确重写equals()是一样的,即正确使用Map必须保证:作为key的对象必须正确重写equals()方法。
c.通过key计算索引的方式就是调用key对象的hashCode()方法,它返回一个int整数。HashMap正是通过这个方法直接定位key对应的value的索引,继而直接返回value。
d.正确使用Map必须保证:
i.作为key的对象必须正确重写equals()方法,相等的两个key实例调用equals()方法必须返回true;
ii.作为key的对象必须正确重写hashCoed()方法:
1.如果两个对象相等,则hashCode()必须相等。
2.如果两个对象不相等,则hashCode()尽量不要相等。
注意:如果两个对象不相等,hashCode()相同,会造成Map内部存储冲突(哈希冲突),影响存取效率。
e.正确实现hashCode(),必须在正确实现了equals的基础上。
i.要正确使用HashMap,作为key的实例必须正确重写equals()和hashCode()方法;
ii.使用Objects.hash()方法计算。
iii.编写equals()和hashCode()遵循的原则:equals()用于比较的每个字段,都必须进行hashCode()计算;equals()没有用到的字段,绝不能放在hashCode()中计算。
iv.对于放入HashMap的value对象,没有任何要求。
v.hashCode()方法编写的越好,HashMap的工作效率就越高。

f.扩展
i.HapMap初始化时默认数组大小是16,内部可自动扩容,扩容后重新确定hashCode()计算的索引位置,会影响效率。
ii.初始化HashMap时可指定容量大小。
1.Map<String, Integer> map = new HashMap<>(10000);
iii.使用Map时,即使不同的两个key的hashCode()相同,只要key不相同,它们映射的value就互不干扰。
iv.在HashMap内部,确实可能存在不同的key,映射到相同的hashCode()。
v.把不同key具有相同hashCode()的情况称为哈希冲突。
使用EnumMap
a.key对象是enum类型,内部是以一个非常紧凑的数组存储value,并且根据enum类型的key直接定位到内部数组的索引,并不需要计算hashCode(),不但效率最高,还不浪费空间。
b.使用Enum集合时,总是用Map接口引用。

TreeMap
a.特点
i.有一种Map,在内部会对Key排序,就是SortedMap,SortedMap是接口,实现类是TreeMap。
ii.SortedMap保证遍历时以Key的顺序来进行排序,使用TreeMap时,放入的Key必须实现Comparable接口。String,Integer这些类已经实现了Comparable接口,可以直接作为Key使用。
iii.对于放入TreeMap的Value对象,没有任何要求。

![]()


iv.如果作为Key的class是自定义的类没有实现Comparable接口,那么,必须在创建TreeMap的同时指定一个自定义排序算法,否则运行报错,TreeMap内部根据比较结果对Key进行排序。


v.自定义排序算法时,必须正确实现相等,小于,大于逻辑,缺一不可!通过排序比较相等的Key,定位对应的Value。


b.总结
i.不需要重写equals()和hashCode(),因为TreeMap不使用equals()和hashCode()。
ii.作为SortedMap的key必须实现Comparable接口,或者传入Comparator。
iii.使用TreeMap时,对key的比较需要正确实现相等,小于,大于逻辑。
相关文章:
Java集合(Map篇)
一.Map a.使用Map i.键值(key-value)映射表的数据结构,能高效通过key快速查找value(元素)。 ii.Map是一个接口,最常用的实现类是HashMap。 iii.重复放入k-v不会有问题,但是一个…...
VUE3配置路由(超级详细)
第一步创建vue3的项目...
【笔记】机器学习算法在异常网络流量监测中的应用
先从一些相对简单的综述类看起,顺便学学怎么写摘要相关工作的,边译边学 机器学习算法在异常网络流量监测中的应用 原文:Detecting Network Anomalies in NetFlow Traffic with Machine Learning Algorithms Authors: Quc Vo, Philippe Ea, Os…...
江协科技STM32学习- P15 TIM输出比较
🚀write in front🚀 🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝…...
使用python-pptx批量删除备注:清除PPT文档中的所有备注信息
哈喽,大家好,我是木头左! 在制作和分享PPT时,经常需要添加一些注释或备注来帮助观众更好地理解内容。然而,有时候需要将这些备注从PPT中移除,以保持演示的简洁性。幸运的是,可以使用python-pptx库来实现这一目标。本文将详细介绍如何使用python-pptx批量删除PPT中的备注…...
RTX NVIDIA 3090卡配置对应pytorch,CUDA版本,NVIDIA驱动过程及问题整理
买了两块3090卡闲置很长时间了,之前tf 1.12.0版本用习惯了不想转工具。这段时间闲下来转了之后有些环境不适配,在雷神帮助下安装完毕,虽然出了点怪东西,整体还好。 原环境CUDA为11.4 其他配置如下 之前conda install的pytorch实为…...
【Verilog学习日常】—牛客网刷题—Verilog快速入门—VL21
根据状态转移表实现时序电路 描述 某同步时序电路转换表如下,请使用D触发器和必要的逻辑门实现此同步时序电路,用Verilog语言描述。 电路的接口如下图所示。 输入描述: input A , input clk , …...
【深度】为GPT-5而生的「草莓」模型!从快思考—慢思考到Self-play RL的强化学习框架
原创 超 超的闲思世界 2024年09月11日 19:17 北京 9月11日消息,据外媒The Information昨晚报道,OpenAI的新模型「草莓」(Strawberry),将在未来两周内作为ChatGPT服务的一部分发布。 「草莓」项目是OpenAI盛传已久的…...
【编程底层原理】Java常用读写锁的使用和原理
一、引言 在Java的并发世界中,合理地管理对共享资源的访问是至关重要的。读写锁(ReadWriteLock)正是一种能让多个线程同时读取共享资源,而写入资源时需要独占访问的同步工具。本文将带你了解读写锁的使用方法、原理以及它如何提高…...
自恢复保险丝SMD1206B005TF在电路中起什么作用
自恢复保险丝SMD1206B005TF在电路中起到过流保护的作用。 自恢复保险丝,也称为正温度系数(PTC)热敏电阻,是一种能够在电流超过预设值时自动断开电路,并在故障排除后自动恢复的元件。这种保险丝的核心材料是高分子聚合…...
2024年躺平,花大半年的时间,就弄了这一件事儿:《C++面试真题宝典》
今年,是我的第3个躺平年,躺得我四肢都快蜕化了... 为了让一切都变得舒服,我决定主动地去做些什。 在我生命的一个不起眼却意义非凡的角落,我与C结下了不解之缘。这份热爱,如同一位老友,陪伴我度过了无数个…...
PHP基础语法讲解
大家好,我是程序员小羊! 前言: PHP(Hypertext Preprocessor)是一种常用于网页开发的服务器端脚本语言,易于学习并且与 HTML 紧密结合。以下是 PHP 的基础语法详细讲解。 1. PHP 基础结构 1.1 PHP 脚本结…...
【论文速看】DL最新进展20240923-长尾综述、人脸防伪、图像分割
目录 【长尾学习】【人脸防伪】【图像分割】 【长尾学习】 [2024综述] A Systematic Review on Long-Tailed Learning 论文链接:https://arxiv.org/pdf/2408.00483 长尾数据是一种特殊类型的多类不平衡数据,其中包含大量少数/尾部类别,这些类…...
device靶机详解
靶机下载地址 https://www.vulnhub.com/entry/unknowndevice64-1,293/ 靶机配置 主机发现 arp-scan -l 端口扫描 nmap -sV -A -T4 192.168.229.159 nmap -sS -Pn -A -p- -n 192.168.229.159 这段代码使用nmap工具对目标主机进行了端口扫描和服务探测。 -sS:使用…...
十四、SOA(在企业中的应用场景)
在企业中,**SOA(面向服务架构)**被广泛应用于多个场景,帮助企业提高灵活性、效率和业务响应能力。SOA通过分解企业系统中的功能模块,以服务的形式进行封装和集成,支持跨平台、跨系统的协同工作。以下是SOA在…...
单片机与PIC的区别:多方面对比
单片机与PIC的区别:多方面对比 在现代电子产品的设计中,单片机和PIC都是不可或缺的控制器。尽管它们在功能上有许多相似之处,但在设计、应用、优势和劣势等方面却有显著区别。今天,我们就来详细对比一下单片机和PIC。 1. 定义与…...
python新手的五个练习题
代码 # 1. 定义一个变量my_Number,将其设置为你的学号,然后输出到终端。 my_Number "20240001" # 假设你的学号是20240001 print("学号:", my_Number) # 2. 计算并输出到终端:两个数(例如3和5)的和、差、乘积和商。 num1 3 num2 5 print(&…...
Go语言并发编程之sync包详解
在当今多核时代,如何高效地利用并发是每个Go语言开发者都需要掌握的技能。Go语言为我们提供了丰富的并发编程工具,其中最基础也是最重要的就是sync包。本文将深入探讨sync包的各种并发原语,包括WaitGroup、Mutex、RWMutex、Cond、Once和Pool,并通过丰富的代码示例和详尽的解…...
函数题 6-10 阶乘计算升级版【PAT】
文章目录 题目函数接口定义裁判测试程序样例输入样例输出样例 题解解题思路完整代码AC代码 编程练习题目集目录 题目 要求实现一个打印非负整数阶乘的函数。 函数接口定义 void Print_Factorial ( const int N ); 其中N是用户传入的参数,其值不超过 1000 1000 10…...
java项目之基于springboot的医院资源管理系统源码
风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的医院资源管理系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 💕💕作者:风…...
从单片机到Linux驱动的技术成长与转型
1. 从单片机到Linux驱动的技术成长之路 刚毕业那会儿,我和大多数电子工程专业的同学一样,怀揣着对技术的无限憧憬。记得大四校招时,我固执地只投递了几家知名大厂的嵌入式开发岗位,甚至在面试时直接报出了远超应届生水平的薪资期望…...
Pixel Aurora Engine镜像部署:支持RTX 3060及以上显卡的轻量级方案
Pixel Aurora Engine镜像部署:支持RTX 3060及以上显卡的轻量级方案 1. 项目概览 Pixel Aurora Engine是一款专为像素艺术创作设计的AI绘图工作站,采用复古8-bit游戏风格界面,让AI艺术创作变得像玩游戏一样有趣。这个轻量级解决方案特别针对…...
Axios 近期安全版本
在执行 npm i 的时候最好执行指定版本:影响版本axios (npm) 0.30.4axios (npm) 1.14.1plain-crypto-js (npm) 4.2.1安全版本axios (npm) < 0.30.3axios (npm) < 1.14.0axios (npm) > 0.30.4axios (npm) > 1.14.1plain-crypto-js (npm) 恶意包已被 np…...
电路板测试点设计与自动化测试实践
1. 测试点的本质作用在电子制造领域,测试点(Test Point)是电路板上那些看似多余的小圆点,但它们却是保证产品质量的关键设计。作为一名有十年经验的硬件工程师,我见过太多因为忽视测试点设计而导致量产失败的案例。测试…...
如何永久保存B站缓存视频?m4s-converter开源工具完整使用指南
如何永久保存B站缓存视频?m4s-converter开源工具完整使用指南 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾经遇到过这样的…...
YouTube面临儿童AI内容监管挑战
专家呼吁YouTube停止向儿童推荐AI视频近日,超200名儿童发展专家及相关机构联名致信谷歌和YouTube高层,强烈要求YouTube及YouTube Kids停止向未成年用户展示或推荐AI生成视频。这些专家指出,大量所谓有“教育用途”的AI视频其实内容空洞、质量…...
FedProx实战:如何用Python在异构网络中优化联邦学习(附代码)
FedProx实战:Python实现异构网络联邦学习优化指南 联邦学习作为分布式机器学习的前沿分支,正面临两大核心挑战:设备间的系统异构性(计算与通信能力差异)和数据分布的统计异构性(non-IID数据)。本…...
2026年最好的AI创业机会,就藏在你压根看不上的角落里
还在焦虑AI会替代你?抢你饭碗?你根本不知道,现在有一群人,正在用AI给自己“印钞票”他们不是搞什么ChatGPT插件,也不是训练大模型,他们就盯着那些看着不起眼,甚至你压根看不上的小事。利用这些小…...
新手必看:用Wireshark分析CTF流量题,手把手教你从抓包到找到Flag
从零玩转Wireshark:CTF流量分析实战指南 第一次打开Wireshark时,满屏跳动的数据包就像天书一样让人头晕目眩。但别担心,每个网络安全高手都曾经历过这个阶段。本文将带你走进CTF流量分析的世界,从最基础的Wireshark操作开始&#…...
oklog架构深度解析:如何实现无协调的分布式日志存储
oklog架构深度解析:如何实现无协调的分布式日志存储 【免费下载链接】oklog A distributed and cordination-free log management system 项目地址: https://gitcode.com/gh_mirrors/ok/oklog 在当今云原生和微服务架构盛行的时代,分布式日志管理…...
