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

【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的底层结构TreeMapHashMap
底层结构红黑树哈希表(数组+链表/红黑树)
插入/删除/查找时间复杂度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底层结构TreeSetHashSet
底层结构红黑树哈希表
插入/删除/查找时间复杂度O(log2N)O(1)
是否有序key有序不一定有序
允许null键不允许,需可比较允许null键
线程安全不安全不安全
插入/删除/查找区别按照红黑树的特性来进行插入和删除1.先计算key哈希地址2.然后进行插入和删除
比较与覆写key必须能够比较,否则会抛出ClassCastException异常

自定义类型需要覆写equals和hashCode方法

应用场景需要key有序无关有序,需要更高的时间性能

🍰四、Map和Set的区别

区别MapSet
存储形式是一种键对值(key-value)集合是值的集合,值存在单一的值,不存在重复元素
访问方式get(key)方法没有键对值的映射,一般通过for循环或者迭代器遍历
唯一性键是唯一的,不用重复,值可以重复所有元素都是唯一的
应用场景需要建立映射关系的场景需要确保元素唯一的场景

相关文章:

【Map vs Set】:Java数据存储的“双子星”对决

个人主页&#xff1a;♡喜欢做梦 欢迎 &#x1f44d;点赞 ➕关注 ❤️收藏 &#x1f4ac;评论 目录 &#x1f370;一、搜索 &#x1f36e;1.概念 &#x1f36e;2.模型 &#x1f370;二、Map &#x1f368;1.什么是Map&#xff1f; &#x1f368;2.Map的实例化 &…...

ollama+langchain+deepseek本机跑通大模型

一、部署deepseek Ollama&#xff0c;这是是一个开源的大语言模型平台&#xff0c;它允许用户在本地环境中运行、创建和共享大型语言模型。Ollama提供了丰富的功能和特性&#xff0c;使得用户可以在自己的计算机上轻松地部署和运行大型语言模型。官网&#xff1a;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…...

【后端面试总结】什么是堆,什么是栈

堆与栈&#xff1a;计算机科学中的两大内存管理利器 在计算机科学中&#xff0c;内存管理是软件开发的核心组成部分之一。其中&#xff0c;堆&#xff08;Heap&#xff09;和栈&#xff08;Stack&#xff09;是两种最基本的内存分配方式&#xff0c;它们各自有着独特的特性和应…...

第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&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1&#xff1a; 输入&#xff1a;nums [1,3,-1,-3,5,3,6,7], …...

傅里叶变换推导

基本模型 假设在二维直角坐标系中&#xff0c;可以用相互垂直的基向量和表示&#xff1a; 假设&#xff1a; 假设在上的投影为&#xff0c;那么&#xff1a; 所以&#xff1a; 用公式表达&#xff1a; 但是在实际中&#xff0c;基向量和不一定长度都是1&#xff0c;重新推导一…...

扣子工作流中禁止同类别的图像流节点,不能超过4个

一、问题1不能在一个工作流中超过4个图像的并行节点 1、现象 本来想着在扣子中一次生成多张图片。 然后问了扣子小助手 2、图像节点限制 扣子给了如下反馈 近期图像流上线了并发限额&#xff0c;具体规则如下&#xff1a; 针对对象&#xff1a;单用户维度&#xff0c;非 bot…...

Java 语言深度剖析与实践应用

一、引言 Java 作为一种广泛应用于各种领域的编程语言&#xff0c;自 1995 年诞生以来&#xff0c;凭借其跨平台性、面向对象特性、丰富的类库以及强大的生态系统&#xff0c;在软件开发行业占据着重要地位。无论是企业级应用开发、移动应用开发、大数据处理还是分布式系统构建…...

1.14学习总结

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

C++蓝桥杯基础篇(三)

片头 哈喽&#xff01;小伙伴们&#xff0c;大家好~&#xff0c;今天我们来学习蓝桥杯基础篇&#xff08;三&#xff09;&#xff0c;继续练习相关习题&#xff0c;准备好了吗&#xff1f;我们开始啦~ 一、while循环 可以简单理解为循环版的if语句。if语句是判断1次&#xff0…...

微信小程序的制作

制作微信小程序的过程大致可以分为几个步骤&#xff1a;从环境搭建、项目创建&#xff0c;到开发、调试和发布。下面我会为你简要介绍每个步骤。 1. 准备工作 在开始开发微信小程序之前&#xff0c;你需要确保你已经完成了以下几个步骤&#xff1a; 注册微信小程序账号&…...

Sass更新:@import——>@use

背景&#xff1a;将一个公共的CSS样式文件导入到任意一个组件中进行使用 一、创建并使用CSS公共样式文件 1、在目录的assets目录下创建一个style文件夹&#xff0c;里面存放一个.scss文件&#xff08;例&#xff1a;mixin.scss&#xff09; 2、文件内以mixin来设置名为flex的…...

Python使用Flask结合DeepSeek开发

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

python中的抽象类在项目中的实际应用

抽象类在项目中的实际应用主要体现在 规范代码结构、强制子类实现某些方法、提供部分通用功能&#xff0c;让代码更稳定、易维护。 举个例子&#xff1a;数据校验器 假设你在做一个 用户输入校验系统&#xff0c;需要支持 数字校验、字符串校验 和 邮箱校验。如果不用抽象类&…...

New Game--(单调队列)

I - New Game 有一种新的游戏&#xff0c;Monocarp 想要玩。这个游戏使用一副包含 n 张牌的牌堆&#xff0c;其中第 i 张牌上写有一个整数 a_i。 在游戏开始时&#xff0c;Monocarp 可以在第一轮选择牌堆中的任意一张牌。在接下来的每一轮中&#xff0c;Monocarp 可以选择一张…...

mapbox V3 新特性,添加下雪效果

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;mapbox 从入门到精通 文章目录 一、&#x1f340;前言1.1 ☘️mapboxgl.Map 地图对象…...

无人机遥感在农林信息提取中的实现方法与GIS融合制图教程

遥感技术作为一种空间大数据手段&#xff0c;能够从多时、多维、多地等角度&#xff0c;获取大量的农情数据。数据具有面状、实时、非接触、无伤检测等显著优势&#xff0c;是智慧农业必须采用的重要技术之一。 一&#xff1a;综合态势分析 1.1 研究区及作物品种分析 &#xff…...

生物发酵展与2025生物医药创新技术与应用发展论坛同期盛大举办

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

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

Docker 运行 Kafka 带 SASL 认证教程

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

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

【JavaWeb】Docker项目部署

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

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

Python Ovito统计金刚石结构数量

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