当前位置: 首页 > 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;风…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

Caliper 负载(Workload)详细解析

Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...