当前位置: 首页 > news >正文

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.键值&#xff08;key-value&#xff09;映射表的数据结构&#xff0c;能高效通过key快速查找value&#xff08;元素&#xff09;。 ii.Map是一个接口&#xff0c;最常用的实现类是HashMap。 iii.重复放入k-v不会有问题&#xff0c;但是一个…...

VUE3配置路由(超级详细)

第一步创建vue3的项目...

【笔记】机器学习算法在异常网络流量监测中的应用

先从一些相对简单的综述类看起&#xff0c;顺便学学怎么写摘要相关工作的&#xff0c;边译边学 机器学习算法在异常网络流量监测中的应用 原文&#xff1a;Detecting Network Anomalies in NetFlow Traffic with Machine Learning Algorithms Authors: Quc Vo, Philippe Ea, Os…...

江协科技STM32学习- P15 TIM输出比较

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…...

使用python-pptx批量删除备注:清除PPT文档中的所有备注信息

哈喽,大家好,我是木头左! 在制作和分享PPT时,经常需要添加一些注释或备注来帮助观众更好地理解内容。然而,有时候需要将这些备注从PPT中移除,以保持演示的简洁性。幸运的是,可以使用python-pptx库来实现这一目标。本文将详细介绍如何使用python-pptx批量删除PPT中的备注…...

RTX NVIDIA 3090卡配置对应pytorch,CUDA版本,NVIDIA驱动过程及问题整理

买了两块3090卡闲置很长时间了&#xff0c;之前tf 1.12.0版本用习惯了不想转工具。这段时间闲下来转了之后有些环境不适配&#xff0c;在雷神帮助下安装完毕&#xff0c;虽然出了点怪东西&#xff0c;整体还好。 原环境CUDA为11.4 其他配置如下 之前conda install的pytorch实为…...

【Verilog学习日常】—牛客网刷题—Verilog快速入门—VL21

根据状态转移表实现时序电路 描述 某同步时序电路转换表如下&#xff0c;请使用D触发器和必要的逻辑门实现此同步时序电路&#xff0c;用Verilog语言描述。 电路的接口如下图所示。 输入描述&#xff1a; input A , input clk , …...

【深度】为GPT-5而生的「草莓」模型!从快思考—慢思考到Self-play RL的强化学习框架

原创 超 超的闲思世界 2024年09月11日 19:17 北京 9月11日消息&#xff0c;据外媒The Information昨晚报道&#xff0c;OpenAI的新模型「草莓」&#xff08;Strawberry&#xff09;&#xff0c;将在未来两周内作为ChatGPT服务的一部分发布。 「草莓」项目是OpenAI盛传已久的…...

【编程底层原理】Java常用读写锁的使用和原理

一、引言 在Java的并发世界中&#xff0c;合理地管理对共享资源的访问是至关重要的。读写锁&#xff08;ReadWriteLock&#xff09;正是一种能让多个线程同时读取共享资源&#xff0c;而写入资源时需要独占访问的同步工具。本文将带你了解读写锁的使用方法、原理以及它如何提高…...

自恢复保险丝SMD1206B005TF在电路中起什么作用

自恢复保险丝SMD1206B005TF在电路中起到过流保护的作用。 自恢复保险丝&#xff0c;也称为正温度系数&#xff08;PTC&#xff09;热敏电阻&#xff0c;是一种能够在电流超过预设值时自动断开电路&#xff0c;并在故障排除后自动恢复的元件。这种保险丝的核心材料是高分子聚合…...

2024年躺平,花大半年的时间,就弄了这一件事儿:《C++面试真题宝典》

今年&#xff0c;是我的第3个躺平年&#xff0c;躺得我四肢都快蜕化了... 为了让一切都变得舒服&#xff0c;我决定主动地去做些什。 在我生命的一个不起眼却意义非凡的角落&#xff0c;我与C结下了不解之缘。这份热爱&#xff0c;如同一位老友&#xff0c;陪伴我度过了无数个…...

PHP基础语法讲解

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; PHP&#xff08;Hypertext Preprocessor&#xff09;是一种常用于网页开发的服务器端脚本语言&#xff0c;易于学习并且与 HTML 紧密结合。以下是 PHP 的基础语法详细讲解。 1. PHP 基础结构 1.1 PHP 脚本结…...

【论文速看】DL最新进展20240923-长尾综述、人脸防伪、图像分割

目录 【长尾学习】【人脸防伪】【图像分割】 【长尾学习】 [2024综述] A Systematic Review on Long-Tailed Learning 论文链接&#xff1a;https://arxiv.org/pdf/2408.00483 长尾数据是一种特殊类型的多类不平衡数据&#xff0c;其中包含大量少数/尾部类别&#xff0c;这些类…...

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&#xff1a;使用…...

十四、SOA(在企业中的应用场景)

在企业中&#xff0c;**SOA&#xff08;面向服务架构&#xff09;**被广泛应用于多个场景&#xff0c;帮助企业提高灵活性、效率和业务响应能力。SOA通过分解企业系统中的功能模块&#xff0c;以服务的形式进行封装和集成&#xff0c;支持跨平台、跨系统的协同工作。以下是SOA在…...

单片机与PIC的区别:多方面对比

单片机与PIC的区别&#xff1a;多方面对比 在现代电子产品的设计中&#xff0c;单片机和PIC都是不可或缺的控制器。尽管它们在功能上有许多相似之处&#xff0c;但在设计、应用、优势和劣势等方面却有显著区别。今天&#xff0c;我们就来详细对比一下单片机和PIC。 1. 定义与…...

python新手的五个练习题

代码 # 1. 定义一个变量my_Number,将其设置为你的学号&#xff0c;然后输出到终端。 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是用户传入的参数&#xff0c;其值不超过 1000 1000 10…...

java项目之基于springboot的医院资源管理系统源码

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

Docker命令全解析:掌握容器化技术的基石

在容器化技术日益普及的今天&#xff0c;Docker作为其中的佼佼者&#xff0c;凭借其轻量级、可移植和易于管理的特性&#xff0c;赢得了广泛的关注和应用。而掌握Docker命令&#xff0c;则是深入理解和高效利用Docker的关键。本文将带您走进Docker命令的世界&#xff0c;从基础…...

2024.9.19

[ABC266F] Well-defined Path Queries on a Namori 题面翻译 题目描述 给定一张有 N N N 个点、 N N N 条边的简单连通无向图和 Q Q Q 次询问&#xff0c;对于每次询问&#xff0c;给定 x i , y i x_i,y_i xi​,yi​&#xff0c;表示两点的编号&#xff0c;请你回答第 x i …...

“跨链桥“的危害

跨链桥&#xff08;Cross-Chain Bridges&#xff09;是连接不同区块链网络的工具&#xff0c;允许用户在不同的区块链之间转移资产和数据。尽管跨链桥为区块链生态系统带来了许多便利&#xff0c;但它们也存在一些潜在的危害和风险。以下是一些主要的危害&#xff1a; 1. 安全…...

GO CronGin

文章目录 Robfig Cron介绍1. **安装 robfig/cron**2. **基本用法**示例&#xff1a;创建一个简单的定时任务3. **Cron 表达式**常用的 Cron 表达式示例&#xff1a;4. **添加和管理任务**5. **上下文支持**6. **使用场景**7. **高级用法**总结 Cron 在Gin中实践使用1. **安装 r…...

手机在网状态查询接口如何用C#进行调用?

一、什么是手机在网状态查询接口&#xff1f; 手机在网状态查询接口是利用实时数据来对手机号码在运营商网络中的状态进行查询的工具&#xff0c;包括正常使用状态、停机状态、不在网状态、预销户状态等。 二、手机在网状态查询适用哪些场景&#xff1f; 例如&#xff1a;商…...

Java面向对象特性与泛型:深入理解与应用

Java作为一种广泛使用的面向对象编程语言&#xff0c;提供了丰富的特性来支持面向对象编程&#xff08;OOP&#xff09;和泛型编程。本文将深入探讨Java的面向对象特性和泛型&#xff0c;以及它们在实际开发中的应用。 1. 面向对象特性 面向对象编程是一种编程范式&#xff0…...

Qwen2.5 本地部署的实战教程

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于大模型算法的研究与应用。曾担任百度千帆大模型比赛、BPAA算法大赛评委,编写微软OpenAI考试认证指导手册。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。授权多项发明专利。对机器学…...

Oracle数据库pl/sql显式抛出异常

在Oracle PL/SQL中&#xff0c;显式地抛出异常&#xff08;Raising Exceptions Explicitly&#xff09;是一种控制程序流程和处理错误的重要机制。当你希望在某些特定条件下中断程序的执行&#xff0c;并通知调用者发生了错误或异常情况时&#xff0c;可以使用这种机制。下面是…...

Undet for sketchup 2023.3注册机 支持草图大师sketchup2021-2022-2023

1.Undet for sketchup 2023.3支持草图大师sketchup2021-2022-2023。支持机载雷达扫描、车载扫描还是地面扫描&#xff0c;对AEC行业用户来说&#xff0c;真正需要的是如何将这些数据快速处理为三维模型&#xff0c;这样才能将这些信息延展到BIM领域发挥效用。因此面对这些海量的…...

Java详细学习路线:从入门到精通的全方位指南

Java作为一种广泛使用的编程语言&#xff0c;以其跨平台性、强大的库支持和广泛的应用领域&#xff08;如Web开发、Android开发、大数据处理等&#xff09;而著称。对于初学者来说&#xff0c;制定一个清晰、系统的学习路线至关重要。以下是一个从Java基础到高级应用的详细学习…...