【java数据结构】map和set
【java数据结构】map和set
- 一、Map和Set的概念以及背景
- 1.1 概念
- 1.2 背景
- 1.3 模型
- 二、Map
- 2.1 Map说明
- 2.2 Map的常用方法
- 三、Set
- 3.1 Set说明
- 3.2 Set的常用方法
- 四、Set和Map的关系
博客最后附有整篇博客的全部代码!!!
一、Map和Set的概念以及背景
1.1 概念
Map和set是一种专门用来进行搜索的容器或者数据结构,其搜索的效率与其具体的实例化子类有关。
1.2 背景
背景:
到现在为止,当我们要找一个元素的时候,我们可以采取直接遍历的方式,时间复杂度为O(N),或者采用二分查找法,时间复杂度为O(logn),但这两个搜索方式是要求这组序列是有序的!并且这两种方式比较适合静态类型的查找,即一般不会对区间进行插入和删除操作了。
但现实生活中,我们会遇到这类情况:
- 根据学生学号找到相应的学生姓名
- 通讯录中,根据姓名找到电话
- 抖音带货,根据链接号找到相应的商品
这些情况我们在日常生活中经常遇到,并且会实时更新里面的内容,例如删除,修改,即动态查找,此时,二分查找,以及直接遍历,都不适合了。而 Map 和 Set 是一种适合动态查找的集合容器。
1.3 模型
一般把搜索的数据称为关键字(Key),和关键字对应的称为值(Value),将其称之为Key-value的键值对,所以
模型会有两种:
- 纯 key 模型,比如:
有一个英文词典,快速查找一个单词是否在词典中
快速查找某个名字在不在通讯录中 - Key-Value 模型,比如:
统计文件中每个单词出现的次数,统计结果是每个单词都有与其对应的次数:<单词,单词出现的次数>
梁山好汉的江湖绰号:每个好汉都有自己的江湖绰号
而Map中存储的就是key-value的键值对,Set中只存储了Key。
二、Map
2.1 Map说明
Map的官方文档
Map是一个接口类,但是并没有继承Iterable和Collection接口,它的存储方式是Key-Value 模型<K,V>,并且K是唯一值,不能重复。
2.2 Map的常用方法
介绍Map接口之前,先给大家讲一下Map.Entry<K, V> ,它是Map的内部类。
- Map.Entry<K, V> 是Map内部实现的用来存放<key, value>键值对映射关系的内部类。
- 注意:Map.Entry<K,V>并没有提供设置Key的方法
Map.Entry<K, V>提供的方法:
这里主要带你了解 Map.Entry<K, V>提供的前三种方法。
/** getKey() 方法* getValue() 方法*/Map<String, Integer> map=new TreeMap<>();map.put("李四",5);map.put("张三",6);map.put("赵六",20);//map.entrySet()将Map集合变为Set集合for (Map.Entry<String, Integer> entry : map.entrySet()) {System.out.println(entry.getKey() + " : " + entry.getValue());}
/** setValue(V value) 方法*/Map<String, String> map=new TreeMap<>();map.put("key1", "value1");map.put("key2", "value2");String oldValue = map.put("key1", "newValue1");System.out.println("Old Value: " + oldValue); // 输出旧值 value1for (Map.Entry<String, String> entry : map.entrySet()) {System.out.println("Key: " + entry.getKey() +" Value: " + entry.getValue());}}
Map的常用方法:
Map<String,Integer> map = new TreeMap<>();map.put("A", 1);map.put("B", 2);map.put("C", 3);// get()方法System.out.println(map.get("A"));// getOrDefault()方法System.out.println(map.getOrDefault("D",-1));// remove()方法map.put("D",4);System.out.println(map);map.remove("D");System.out.println(map);// containsKey()方法System.out.println(map.containsKey("A"));//trueSystem.out.println(map.containsKey("D"));///false// containsValue()方法System.out.println(map.containsValue(1));//trueSystem.out.println(map.containsValue(5));//false// keySet()方法获取所有的键Set<String> keys = map.keySet();System.out.println("Keys: " + keys);// values()方法获取所有的值Collection<Integer> values = map.values();System.out.println("Values: " + values);
注意:
- Map是一个接口,不能直接实例化对象,如果要实例化对象只能实例化其实现类TreeMap或者HashMap
- Map中存放键值对的Key是唯一的,value是可以重复的
- Map中的Key可以全部分离出来,存储到Set中来进行访问(因为Key不能重复)。
- Map中的value可以全部分离出来,存储在Collection的任何一个子集合中(value可能有重复)。
- Map中键值对的Key不能直接修改,value可以修改,如果要修改key,只能先将该key删除掉,然后再来进行重新插入。
- 在Map中插入键值对时,key不能为空,否则就会抛NullPointerException异常,但是value可以为空
- TreeMap和HashMap的区别
三、Set
3.1 Set说明
Set的官方文档
Set是一个接口,它继承了Iterable和Collection接口,它的存储方式是Key 模型,并且K是唯一值,不能重复。
3.2 Set的常用方法
Set<String> set = new TreeSet<String>();set.add("A");set.add("B");set.add("C");// contains()方法
// System.out.println(set.contains("A"));//ture
// System.out.println(set.contains("D"));//false// remove()方法
// set.add("E");
// System.out.println(set);
// set.remove("E");
// System.out.println(set);// size()方法
// System.out.println(set.size());// isEmpty()方法
// System.out.println(set.isEmpty());// clear()方法
// System.out.println(set.size());
// set.clear();
// System.out.println(set.size());Object[] array = set.toArray();System.out.println("Array from set: " + Arrays.toString(array));// 创建另一个集合Collection<String> collection = Arrays.asList("Banana", "Cherry", "Date");// 使用containsAll()方法检查set是否包含集合中的所有元素boolean containsAll = set.containsAll(collection);System.out.println("是否包含Set集合中所有的元素 " + containsAll);// 使用addAll()方法将集合中的元素添加到set中(可以达到去重的效果)boolean added = set.addAll(collection);System.out.println("将所有元素是否成功添加到set集合中 " + added);System.out.println("添加成功后的集合 " + set);}
注意:
- Set是继承自Collection和Iterator的一个接口类,所以它可以通过迭代器打印集合元素
- Set中只存储了key,并且要求key一定要唯一
- Set的底层是使用Map来实现的,其使用key与Object的一个默认对象作为键值对插入到Map中的
- Set最大的功能就是对集合中的元素进行去重
- 实现Set接口的常用类有TreeSet和HashSet,还有一个LinkedHashSet,LinkedHashSet是在HashSet的基础上维护了一个双向链表来记录元素的插入次序
- Set中的Key不能修改,如果要修改,先将原来的删除掉,然后再重新插入
- Set中不能插入null的key。
- TreeSet和HashSet的区别:
四、Set和Map的关系
- HashSet:
- 底层数据结构是HashMap。
- 利用HashMap的键来存储元素,由于HashMap的键不允许重复,因此保证了HashSet中元素的唯一性。
- 不保证元素的顺序。
- LinkedHashSet:
- 底层数据结构是LinkedHashMap。
- 同样利用LinkedHashMap的键来存储元素,保证了元素的唯一性。
- 与HashSet相比,LinkedHashSet保持了元素的插入顺序。
- TreeSet:
- 底层数据结构是TreeMap(在Java7及之前)或红黑树(在Java 8及之后)。 利用TreeMap的键来存储元素,通过树形结构保证了元素的有序性。
- 元素按照自然顺序或构造时指定的比较器(Comparator)排序。
上述这三种都是通过Map来实现Set的,但并不是所有Set集合都是通过Map来实现的。
TreeSet底层是通过TreeMap实现的,那add的时候为什么没有value值?
此篇博客的全部代码!!!
相关文章:

【java数据结构】map和set
【java数据结构】map和set 一、Map和Set的概念以及背景1.1 概念1.2 背景1.3 模型 二、Map2.1 Map说明2.2 Map的常用方法 三、Set3.1 Set说明3.2 Set的常用方法 四、Set和Map的关系 博客最后附有整篇博客的全部代码!!! 一、Map和Set的概念以及…...
飞牛NAS安装过程中的docker源问题
采用CloudFlare进行飞牛NAS的远程访问 【安全免费】无需公网IP、端口号,NAS外网访问新方法_网络存储_什么值得买 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<EOF {"registry-mirrors": ["https://docker.1panel.dev&quo…...
Linux(Centos 7.6)命令详解:dos2unix
1.命令安装 dos2unix 命令默认情况下是没有安装的,如配置yum源,可通过yum安装命令如下: yum install dos2unix dos2unix 有一个对立的命令unix2dos,也需要yum安装,一般使用不到这里不做过多解释,具体参数…...
Linux MySQL离线安装
一、准备工作 1. 下载MySQL安装包 访问MySQL官方网站,选择适合您Linux系统的MySQL版本进行下载。通常推荐下载Generic Linux (glibc 2.12)版本的.tar.gz压缩包,例如mysql-8.0.33-linux-glibc2.12-x86_64.tar.xz。将下载好的安装包拷贝到Linux服务器的某…...

声明,这些内容和我无关
声明,下面这些内容和我无关,不是我写的,买了我不负责答疑,也不负责其他相关。 一下内容都不是我写的,系统自己加上去的,和我无关,我不负责答疑也不负责其他。...

ISO:摄影中的光线敏感度密码
目录 一、ISO 究竟是什么 二、ISO 与光线的关系 (一)低 ISO 在充足光线下的表现 (二)高 ISO 在光线不足时的作用 三、ISO 对画质的影响 (一)低 ISO 带来的优质画质 (二)高 IS…...

长短期记忆网络LSTM
视频链接 1.LSTM与RNN的区别 RNN想把所有信息都记住,不管是有用的信息还是没用的信息,并且有梯度爆炸或者梯度消失的问题 而LSTM设计了一个记忆细胞,具备选择记忆功能,可以选择记忆重要信息,过滤掉噪声信息࿰…...

2. 握手问题python解法——2024年省赛蓝桥杯真题
原题传送门:1.握手问题 - 蓝桥云课 问题描述 小蓝组织了一场算法交流会议,总共有 50人参加了本次会议。在会议上,大家进行了握手交流。按照惯例他们每个人都要与除自己以外的其他所有人进行一次握手 (且仅有一次)。但有 7 个人,…...

poi在word中打开本地文件
poi版本 5.2.0 方法1:使用XWPFFieldRun(推荐) 比如打开当前相对路径的aaaaa.docx XWPFFieldRun run paragraph.createFieldRun();CTRPr ctrPr run.getCTR().addNewRPr();CTFonts font ctrPr.addNewRFonts();// 设置字体font.setAscii(&quo…...

国产编辑器EverEdit - 输出窗口
1 输出窗口 1.1 应用场景 输出窗口可以显示用户执行某些操作的结果,主要包括: 查找类:查找全部,筛选等待操作,可以把查找结果打印到输出窗口中; 程序类:在执行外部程序时(如:命令窗…...
整数的个数(信息学奥赛一本通-1067)
【题目描述】 给定k(1<k<100)个正整数,其中每个数都是大于等于1,小于等于10的数。写程序计算给定的k个正整数中,1,5和10出现的次数。 【输入】 输入有两行:第一行包含一个正整数k,第二行包含k个正整数…...

ios swift画中画技术尝试
继上篇:iOS swift 后台运行应用尝试失败-CSDN博客 为什么想到画中画,起初是看到后台模式里有一个picture in picture,去了解了后发现这个就是小窗口视频播放,方便用户执行多任务。看小窗口视频的同时,可以作其他的事情…...
MyBatis 写法
MyBatis 高效使用技巧 常见 MyBatis 使用技巧,这些技巧有助于简化数据库操作,提高开发效率,并增强系统的性能。 1. 动态 SQL 动态 SQL 让开发者能够依据参数灵活地构建 SQL 语句,避免了手动拼接字符串带来的复杂性和错误风险。…...

Three城市引擎地图插件Geo-3d
一、简介 基于Three开发,为Three 3D场景提供GIS能力和城市底座渲染能力。支持Web墨卡托、WGS84、GCJ02等坐标系,支持坐标转换,支持影像、地形、geojson建筑、道路,植被等渲染。支持自定义主题。 二、效果 三、代码 //插件初始化…...
【贪心算法】洛谷P1106 - 删数问题
2025 - 01 - 22 - 第 46 篇 【洛谷】贪心算法题单 - 【贪心算法】 - 【学习笔记】 作者(Author): 郑龙浩 / 仟濹(CSND账号名) 目录 文章目录 目录P1106 删数问题题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示思路代码 P1106 删数问题 题目描述 键盘输入一个高…...

WPS计算机二级•幻灯片的页面布局
听说这是目录哦 设置PPT页面尺寸🖼️PPT母版怎么用🎨巧用PPT母版统一修改 字体颜色与背景🎡如何快速更改应用 幻灯片中的不同母版👑能量站😚 设置PPT页面尺寸🖼️ 在制作PPT时,我们需要先选定一…...
从入门到精通:HttpClient深度剖析与实战指南
一、引言 1.1 背景引入 在当今数字化时代,网络编程已成为软件开发中不可或缺的一部分。而 HTTP 通信作为网络编程的核心,承担着客户端与服务器之间数据传输的重任。无论是 Web 应用、移动应用,还是分布式系统,HTTP 协议都扮演着…...

IoTDB 2025 春节值班与祝福
2025 春节快乐 瑞蛇迎吉庆,祥光映华年,2025 春节已近在眼前。社区祝福 IoTDB 的所有关注者、支持者、使用者 2025 新年快乐,“蛇”来运转! IoTDB 团队的春节放假时间为 2025 年 1 月 27 日至 2 月 4 日,1 月 25 日、26…...

Java 大视界 -- Java 大数据中的隐私增强技术全景解析(64)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...

【2024年华为OD机试】 (A卷,100分)- 整理扑克牌(JavaScriptJava PythonC/C++)
一、问题描述 题目描述 给定一组数字,表示扑克牌的牌面数字,忽略扑克牌的花色,请按如下规则对这一组扑克牌进行整理: 步骤1:分组形成组合牌 炸弹:当牌面数字相同张数大于等于4时。葫芦:3张相同牌面数字 + 2张相同牌面数字,且3张牌与2张牌不相同。三张:3张相同牌面数…...

Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...

04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...

ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...

算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...

Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...