【Map vs Set】:Java数据存储的“双子星”对决
个人主页:♡喜欢做梦
欢迎 👍点赞 ➕关注 ❤️收藏 💬评论
目录
🍰一、搜索
🍮1.概念
🍮2.模型
🍰二、Map
🍨1.什么是Map?
🍨2.Map的实例化
🍨3.Map的常见方法
🍨4.Map方法的使用
🍰三、Set
🍯1.什么是Set?
🍯2.Set的常见方法
🍯3.Set方法的使用
🍰四、Map和Set的区别
🍰一、搜索
🍮1.概念
搜索:是指在数据集合过程中查找特定元素或满足特定条件元素的过程。如:在一组数组中查找特定的数字。常见的搜索有直接遍历和二分查找.....
直接遍历和二分查找比较适合静态类型的查找,即一般不会对区间进行插入和删除操作。
所以当需要动态查找时,即查找时要进行一些插入和删除,上述的方法并不适用 。如:在学生系统中,快速查找学生的成绩、统计单词出现的次数、确保用户名唯一(去重)。
Map和Set是一种专门用来进行搜索的容器或者数据结构,是一种适合动态查找的集合容器。
🍮2.模型
一般把搜索的数据称为关键字(key),和关键字对应的称为值(value),所以有两种模型:
- 1.纯key模型:由唯一的键(key)组成,没有与键直接关联的特定值(value)。
特点:重点在于对键的管理和操作,常用于判断某个元素是否存在。
应用场景:数据去重,黑名单过滤等......
- 2.key-value模型:是一种键(key)和值(value)进行相关联的数据组织形式。每个键都对应着一个特定的值,通过键可以快速查找、更新与之关联的值。如查找在一串字符串中查找,某个单词在该字符串中出现的次数。
特点:键是唯一的,用于快速定位和访问对应的值,其值可以是各种类型的数据。
应用场景:广泛应用于配置文件、数据库等,比如,以用户ID为键,存储用户姓名等为值。
Set只存储了key,Map存储的就是key—value的键对值。
🍰二、Map
🍨1.什么是Map?
Map是接口类,该类没有继承Collection,储存的是<K,V>结构的键值对,并且K一定是唯一的,不能重复。
🍨2.Map的实例化
Map<K,V>是将键(key)与值(value)进行关联的数据结构,K代表键的类型,V代表值的类型。
Map的实现类主要有HashMap,TreeMap
实例化的实现:
public static void main(String[] args) {Map<String,Integer> map1=new HashMap<>();Map<String,Integer> map2=new TreeMap<>();}
- Map是一个接口,不能直接实例化对象,如果要实例化对象只能通过其实现类TreeMap或者HashMap来实现
🍨3.Map的常见方法
方法 | 解释 |
V put(K key,V value) | 设置key值与value值相关联 |
V remove(Object key) | 将key对应的映射关系删除 |
V remove(Object key,Object value) | 只有指定的键与指定的值相匹配时才可以删除 |
V get(Object key) | 返回key对应的value值 |
V getOrDefault(Object key,V defalutValue) | 返回key对应的value,key不存在,返回默认值 |
Set<K> keySet() | 返回key中的不重复集合 |
Collection<V> values() | 返回value的可重复集合 |
Set<Map.Entry<K,V>> entrySet() | 返回所有的key-value的映射关系 |
boolean containsKey(Object key) | 判断是否包含key |
boolean containsValue(Object value) | 判断是否包含value |
🍨4.Map方法的使用
public static void main(String[] args) {Map<String,Integer> map=new HashMap<>();//map:设置k,v值map.put("a",2);map.put("c",5);map.put("s",21);//get:获取key对应的value值System.out.println(map.get("a"));//2System.out.println(map.get("b"));//不存在key值,其默认值为null//getOrDefault://如果map中有key值,返回key对应的value1值,否则返回设置的默认值System.out.println(map.getOrDefault("a",1));//2System.out.println(map.getOrDefault("b",3));//3//remove1:如果key值与指定的值相匹配,删除;否则,不删除map.remove("a",1);//不匹配不删除System.out.println(map.get("a"));//a对应的value还是2//remove2:删除key对应的value值map.remove("a");System.out.println(map.get("a"));//null//containsKey:判断是否包含keySystem.out.println(map.containsKey("c"));//true//containsValue:判断是否包含value值System.out.println(map.containsValue(10));//falseMap<String,Integer> map1=new TreeMap<>();map1.put("a",2);map1.put("a",3);map1.put("b",3);map1.put("c",6);//Set<K> keySet:返回key中不重复的集合Set<String> keySet=map1.keySet();System.out.println(keySet);//[a, b, c]//Collection<V> values:返回value中可重复的集合Collection<Integer> value=map1.values();System.out.println(value);//[3, 3, 6]//Set<K,V>> entrySet:返回key-value所有的映射关系Set<Map.Entry<String,Integer>> entrySet=map1.entrySet();System.out.println(entrySet);//[a=3, b=3, c=6]}
注意事项:
- Map中存放键值对的Key是唯一的,value是可重复的,当put相同的key,不同的value值时,只是将key所对应的value值进行替换,以最后存放的value为主;
public static void main(String[] args) {Map<String,Integer> map=new HashMap<>();map.put("a",11);map.put("a",24);map.put("a",15);System.out.println(map.get("a"));//15
}
- 在HashMap中存放的key和value可以都为空,在TreeMap中插入键对值时,key不能为空,value可以为空;
HashMap
public static void main(String[] args) {Map<String,Integer> map1=new HashMap<>();map1.put("a",null);map1.get("a");//无异常map1.put(null,null);map1.get(null);//无异常}
TreeMap
public static void main(String[] args) {Map<String,Integer> map1=new TreeMap<>();map1.put("a",null);map1.get("a");//无异常map1.put(null,2);map1.get(null);//报错}
- Map中键值对的key不能直接修改,可以直接修改value值,如果要修改key,只能将key删除,在进行重新插入。
- HashMap和TreeMap是Map的接口实现类,用于存储键对值数据,以下是他们的区别:
Map的底层结构 | TreeMap | HashMap |
底层结构 | 红黑树 | 哈希表(数组+链表/红黑树) |
插入/删除/查找时间复杂度 | O(log2N) | O(1) |
是否有序 | 关于Key有序 | 无序 |
允许null键 | 不允许,需可比较 | 允许null键 |
线程安全 | 不安全 | 不安全 |
插入/删除/查找区别 | 需要进行元素比较 | 通过哈希函数计算哈希地址 |
比较与覆写 | key必须能够比较,否则会抛出异常 | 自定义类型需要覆写equals和hashCode方法 |
应用场景 | 需要key有序 | 无序有序,需要更高的时间性能 |
🍰三、Set
🍯1.什么是Set?
Set是一个接口,继承自Collection接口,有HashSet、TreeSet等实现类,HashSet基于哈希表实现,不保证元素有序;TreeSet基于红黑树实现,会对元素进行排序。
🍯2.Set的常见方法
方法 | 解释 |
boolean add(E e) | 添加元素,但元素重复不添加 |
boolean remove(Object o) | 删除集合中元素o |
boolean contains(Object o) | 判断o是否包含在集合中 |
boolean isEmpty() | 检测是否为空,为空返回false,否则返回true |
void clear() | 清空 |
Iterator<E> iterator() | 使用迭代器遍历集合中的对象 |
int size() | 返回set中元素个数 |
Object[] toArray() | 将set中的元素转换为数组返回 |
boolean containsAll(Collection<?>c) | 集合中的元素是否在set中的全部存在,是返回true,否则返回false |
boolean addAll(Collection<? extend) | 将集合c中的元素添加到set中,可以达到去重的效果 |
🍯3.Set方法的使用
public static void main(String[] args) {public static void main(String[] args) {Set<Integer> set1=new HashSet<>();//add:添加元素set1.add(5);set1.add(20);set1.add(15);set1.add(8);//remove:移除元素set1.remove(20);//是否包含该元素System.out.println(set1.contains(5));//trueSystem.out.println(set1.contains(2));//false//Iterator:遍历集合Iterator<Integer> iterator=set1.iterator();while(iterator.hasNext()){System.out.print(iterator.next()+" ");//5 8 15}System.out.println();//isEmpty:判断是否为空System.out.println(set1.isEmpty());//false:不为空//size:计算元素个数System.out.println(set1.size());//3//toArray:将set中的元素转换为数组Integer[] toArray=set1.toArray(new Integer[0]);for (Integer x:toArray) {System.out.print(x+" ");//5 8 15}System.out.println();//containsAll:set是否包含指定集合的所有元素Set<Integer> set2=new HashSet<>();set2.add(1);set2.add(2);set2.add(3);Set<Integer> set3=new HashSet<>();set3.add(1);set3.add(2);//看set2中是否都包含set3集合中的元素boolean containsAll=set2.containsAll(set3);System.out.println(containsAll);//true//addAll:将集合中的元素添加到set中Set<Integer> set4=new TreeSet<>();set4.add(1);set4.add(5);set4.add(19);Set<Integer> set5=new TreeSet<>();set5.add(2);set5.add(1);set5.add(6);boolean addAll=set4.addAll(set5);Iterator<Integer> iterator1=set4.iterator();while(iterator1.hasNext()){//如果是HashSet那么不自动排序,如果是TreeSet就自动排序System.out.print(iterator1.next()+" ");//1 2 5 6 19}
注意:
- Set只存储了key,并且要求key一定要唯一,其key值不能进行修改,如果要进行修改需要删除后再插入。
- Set可以对集合进行去重;
- TreeSet的底层是使用Map来实现的,其使用key与Object的一个默认对象作为键值对插入到Map中;
- TreeSet和HashSet的区别
Set底层结构 | TreeSet | HashSet |
底层结构 | 红黑树 | 哈希表 |
插入/删除/查找时间复杂度 | O(log2N) | O(1) |
是否有序 | key有序 | 不一定有序 |
允许null键 | 不允许,需可比较 | 允许null键 |
线程安全 | 不安全 | 不安全 |
插入/删除/查找区别 | 按照红黑树的特性来进行插入和删除 | 1.先计算key哈希地址2.然后进行插入和删除 |
比较与覆写 | key必须能够比较,否则会抛出ClassCastException异常 | 自定义类型需要覆写equals和hashCode方法 |
应用场景 | 需要key有序 | 无关有序,需要更高的时间性能 |
🍰四、Map和Set的区别
区别 | Map | Set |
存储形式 | 是一种键对值(key-value)集合 | 是值的集合,值存在单一的值,不存在重复元素 |
访问方式 | get(key)方法 | 没有键对值的映射,一般通过for循环或者迭代器遍历 |
唯一性 | 键是唯一的,不用重复,值可以重复 | 所有元素都是唯一的 |
应用场景 | 需要建立映射关系的场景 | 需要确保元素唯一的场景 |
相关文章:

【Map vs Set】:Java数据存储的“双子星”对决
个人主页:♡喜欢做梦 欢迎 👍点赞 ➕关注 ❤️收藏 💬评论 目录 🍰一、搜索 🍮1.概念 🍮2.模型 🍰二、Map 🍨1.什么是Map? 🍨2.Map的实例化 &…...

ollama+langchain+deepseek本机跑通大模型
一、部署deepseek Ollama,这是是一个开源的大语言模型平台,它允许用户在本地环境中运行、创建和共享大型语言模型。Ollama提供了丰富的功能和特性,使得用户可以在自己的计算机上轻松地部署和运行大型语言模型。官网:https://ollam…...

03【FreeRTO队列-如何获取任务信息与队列的动静态创建】
一.利用 vTaskList()以及 vTaskGetRunTimeStats()来获取任务的信息 1.现象与开启启用宏 freeRTOSConfig.h //必须启用 #define configUSE_TRACE_FACILITY 1 #define configGENERATE_RUN_TIME_STATS 1 #define configUSE_STATS_FORMATTING_FUNCTIONS…...

vue-plugin-hiprint (vue2
页面效果 <template><div><div class="d-flex flex-column mt5"><div class="d-flex flex-row " style="margin-bottom: 10px;justify-content: center;"><!-- 纸张大小 A3、A4 等 --><div class="paper…...
【后端面试总结】什么是堆,什么是栈
堆与栈:计算机科学中的两大内存管理利器 在计算机科学中,内存管理是软件开发的核心组成部分之一。其中,堆(Heap)和栈(Stack)是两种最基本的内存分配方式,它们各自有着独特的特性和应…...

第39周:猫狗识别 2(Tensorflow实战第九周)
目录 前言 一、前期工作 1.1 设置GPU 1.2 导入数据 输出 二、数据预处理 2.1 加载数据 2.2 再次检查数据 2.3 配置数据集 2.4 可视化数据 三、构建VGG-16网络 3.1 VGG-16网络介绍 3.2 搭建VGG-16模型 四、编译 五、训练模型 5.1 上次程序的主要Bug 5.2 修改版…...
力扣--239.滑动窗口最大值
问题 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1: 输入:nums [1,3,-1,-3,5,3,6,7], …...
傅里叶变换推导
基本模型 假设在二维直角坐标系中,可以用相互垂直的基向量和表示: 假设: 假设在上的投影为,那么: 所以: 用公式表达: 但是在实际中,基向量和不一定长度都是1,重新推导一…...

扣子工作流中禁止同类别的图像流节点,不能超过4个
一、问题1不能在一个工作流中超过4个图像的并行节点 1、现象 本来想着在扣子中一次生成多张图片。 然后问了扣子小助手 2、图像节点限制 扣子给了如下反馈 近期图像流上线了并发限额,具体规则如下: 针对对象:单用户维度,非 bot…...
Java 语言深度剖析与实践应用
一、引言 Java 作为一种广泛应用于各种领域的编程语言,自 1995 年诞生以来,凭借其跨平台性、面向对象特性、丰富的类库以及强大的生态系统,在软件开发行业占据着重要地位。无论是企业级应用开发、移动应用开发、大数据处理还是分布式系统构建…...

1.14学习总结
日常刷题单 刷了题目后,对于排序方法更加熟练,手搓代码的速度也得到了提高。 感觉字符串还不熟练,高精度更是云里雾里,上升空间极大。 同时看见今晚有个入门难度的测试,去练了练手,想看看自己是什么成分&…...

C++蓝桥杯基础篇(三)
片头 哈喽!小伙伴们,大家好~,今天我们来学习蓝桥杯基础篇(三),继续练习相关习题,准备好了吗?我们开始啦~ 一、while循环 可以简单理解为循环版的if语句。if语句是判断1次࿰…...
微信小程序的制作
制作微信小程序的过程大致可以分为几个步骤:从环境搭建、项目创建,到开发、调试和发布。下面我会为你简要介绍每个步骤。 1. 准备工作 在开始开发微信小程序之前,你需要确保你已经完成了以下几个步骤: 注册微信小程序账号&…...

Sass更新:@import——>@use
背景:将一个公共的CSS样式文件导入到任意一个组件中进行使用 一、创建并使用CSS公共样式文件 1、在目录的assets目录下创建一个style文件夹,里面存放一个.scss文件(例:mixin.scss) 2、文件内以mixin来设置名为flex的…...

Python使用Flask结合DeepSeek开发
一、背景 我之前关于DeepSeek使用ollama部署的文章大家可以把DeepSeek大模型部署起来。那么ollama还提供了可以调用对应部署模型的API接口。我们可以基于这些接口,做自己的二次开发。使用pythonflaskollama就可以进行模型对话调用。并且前端采用SSE的技术࿰…...

python中的抽象类在项目中的实际应用
抽象类在项目中的实际应用主要体现在 规范代码结构、强制子类实现某些方法、提供部分通用功能,让代码更稳定、易维护。 举个例子:数据校验器 假设你在做一个 用户输入校验系统,需要支持 数字校验、字符串校验 和 邮箱校验。如果不用抽象类&…...
New Game--(单调队列)
I - New Game 有一种新的游戏,Monocarp 想要玩。这个游戏使用一副包含 n 张牌的牌堆,其中第 i 张牌上写有一个整数 a_i。 在游戏开始时,Monocarp 可以在第一轮选择牌堆中的任意一张牌。在接下来的每一轮中,Monocarp 可以选择一张…...

mapbox V3 新特性,添加下雪效果
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象…...
无人机遥感在农林信息提取中的实现方法与GIS融合制图教程
遥感技术作为一种空间大数据手段,能够从多时、多维、多地等角度,获取大量的农情数据。数据具有面状、实时、非接触、无伤检测等显著优势,是智慧农业必须采用的重要技术之一。 一:综合态势分析 1.1 研究区及作物品种分析 ÿ…...

生物发酵展与2025生物医药创新技术与应用发展论坛同期盛大举办
近日,备受瞩目的生物发酵展与2025生物医药创新技术与应用发展论坛暨展览会宣布将同期盛大举办。这一消息标志着生物科技领域两大盛会的强强联合,将为全球生物科技与医药行业带来前所未有的交流与合作机遇。 生物发酵展作为生物科技领域的知名展会&#x…...

CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...

Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...