Map 和 Set 使用的区别和联系(建议收藏)

2023-11-07


表现 : 两个接口: Set 和 Map 接口

在这里插入图片描述

1、搜索:

(1)概念及场景

Map 和 set 是一种专门用来进行 搜索的容器 或者 数据结构,其搜索的效率与其具体的实例化子类有关

以前常见的搜索方式有:

  • 1、直接遍历,时间复杂度为O(N),元素如果比较多效率会非常慢
  • 2、二分查找,时间复杂度为 ,但搜索前必须要求序列是有序的

上述排序 比较适合 静态类型 的查找,即一般不会对区间进行插入和删除操作了,而现实中的查找比如:

  • 1、根据姓名查询考试成绩
  • 2、通讯录,即根据姓名查询联系方式
  • 3、不重复集合,即需要先搜索关键字是否已经在集合中

可能在查找时进行一些插入和删除的操作,即动态查找,那上述两种方式就不太适合了,本节介绍的Map和Set是一种适合动态查找的集合容器。

(2)模型:

一般把搜索的数据称为关键字(Key),和关键字对应的称为值(Value),将其称之为Key-value的键值对,
所以模型会有两种:

  • 1、纯 key 模型,比如:
    有一个英文词典,快速查找一个单词是否在词典中
    快速查找某个名字在不在通讯录中
  • 2、Key-Value 模型,比如:
    统计文件中每个单词出现的次数,统计结果是每个单词都有与其对应的次数:<单词,单词出现的次数>
    梁山好汉的江湖绰号:每个好汉都有自己的江湖绰号

Map 中存储的就是 key-value 的键值对Set 中只存储了 Key

2、Map 的使用

Map是一个接口类,该类没有继承自Collection,该类中 存储 的是 <K,V>结构的键值对,并且K一定是唯一 的,不能重复
在这里插入图片描述

Map <k,v> (k - 键的类型,v - 值的类型 )

Map.Entry <K, V> 是 Map内部 实现的用来 存放<key, value>键值对映射 关系的内部类,该内部类中主要提供了<key, value>的获取,value的设置以及Key的比较方式

方法名 说明
K getKey() 返回 entry 中的 key
V getValue() 返回 entry 中的 value
V setValue(V value) 将键值对中的 value 替换为指定的 value

注意:Map.Entry<K,V>并 没有提供 设置Key的方法

Map常见方法:

方法名 说明
put (K key,V value) 将 key - value 映射关系放入到 map 集合中(若存在,则替换)
get (Object k) 返回 k 对应 value(若该键不存在,则返回 Null)
getOrDefault (K key,V defaultValue) 返回 k 对应的 value(若该键不存在,则返回 defaultValue,但不会修改集合本身)
remove (K key) 删除 key - value 映射关系(若存在则返回 value,否则返回 null,会修改集合)
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

注意:

  • 1、Map是一个 接口不能直接实例化对象,如果要实例化对象只能实例化其实现类TreeMap或者HashMap
  • 2、Map中存放键值对的 Key是唯一的 ,value是可以重复的
  • 3、在Map中插入键值对时,key不能为空,否则就会抛NullPointerException异常,但是value可以为空
  • 4、Map中的Key可以全部分离出来,存储到Set中来进行访问(因为Key不能重复)。
  • 5、Map中的value可以全部分离出来,存储在Collection的任何一个子集合中(value可能有重复)
  • 6、Map中键值对的 Key不能直接修改,value可以修改,如果要修改key,只能先将该key删除掉,然后再来进行重新插入
  • 7、TreeMap 和 HashMap 的区别
Map 底层结构 TreeMap HashMap
底层结构 红黑树 哈希桶
插入 / 删除 / 查找时间复杂度 O(log2 N) O(1)
是否有序 关于 Key 有序 无序
线程安全 不安全 不安全
插入 / 删除 / 查找区别 需要进行元素比较 通过哈希函数计算哈希地址
比较 与 覆写 key 必须能够比较,否则会抛出异常 自定义类型需要覆写 equals 和 hashCode 方法
应用场景 需要 Key 有序场景下 Key 是否有序不关心,需要更高的时间性能

3、Set 的使用

Set与Map主要的不同有两点:Set是继承自Collection的接口类,Set中只存储了Key
在这里插入图片描述

Set 常用方法:

返回类型 方法名 说明
boolean add(E e) 若指定元素不存在,则将该元素添加
void clear() 清空集合
boolean isEmpty() 判断集合是否为空
int size() 返回元素个数
boolean remove(Object o) 删除指定元素
boolean contains(Object o) 返回是否存在该元素
boolean retainAll(Collection<?> c) 求 this 和 c 的交集
Iterator< E > iterator() 返回迭代器
Object[] toArray() 将 set 中的元素转换为数组返回

注意:

  • 1、Set是继承自Collection的一个接口类
  • 2、Set中 只存储了key,并且要求 key一定要唯一
  • 3、Set的 底层 是使用 Map 来实现的,其使用key与Object的一个默认对象作为键值对插入到Map中
  • 4、Set最大的功能就是对 集合中的元素进行去重
  • 5、实现Set接口的常用类有TreeSet和HashSet,还有一个LinkedHashSet,LinkedHashSet是在HashSet的基础上维护了一个双向链表来记录元素的插入次序。
  • 6、Set中的Key不能修改,如果要修改,先将原来的删除掉,然后再重新插入
  • 7、Set中 不能插入null的key
  • 8、TreeSet和HashSet的区别
Set 底层结构 TreeSet HashSet
底层结构 红黑树 哈希桶
插入 / 删除 / 查找时间复杂度 O(log2 N) O(1)
是否有序 关于 Key 有序 不一定有序
线程安全 不安全 不安全
插入 / 删除 / 查找区别 按照红黑树的特性来进行插入和删除 1、先计算 key 哈希地址 2、然年进行插入和删除
比较 与 覆写 key 必须能够比较,否则会抛出异常 自定义类型需要覆写 equals 和 hashCode 方法
应用场景 需要 Key 有序场景下 Key 是否有序不关心,需要更高的时间性能
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Map 和 Set 使用的区别和联系(建议收藏) 的相关文章

  • 如何使 find() 能够处理一组结构?

    我正在使用一个set保存包含多个字符串的结构 我希望能够使用find 集的功能 但是 由于该集合保存结构 因此它不起作用 我想find 仅查看结构中的字符串之一 如何才能做到这一点 这是我尝试使用的代码 除了以下部分之外 它工作正常find
  • 如何检查某个值是否存在于任何给定集合中

    假设我有不同的集合 它们必须不同 我无法根据我正在使用的数据类型加入它们 r set 1 2 3 s set 4 5 6 t set 7 8 9 检查给定变量是否存在于其中任何一个中的最佳方法是什么 我在用 if myvar in r or
  • .NET C# 中的设置操作

    我现在正在研究与粗糙集相关的东西 该项目使用了大量的集合操作和操作 我一直使用字符串操作作为集合操作的权宜之计 它一直工作得很好 直到我们需要通过算法处理一些大量的数据 500 000 条记录 每条记录大约 40 多列 我知道 net 2
  • set.pop() 是确定性的吗?

    我知道 python 集合的元素是没有顺序的 调用pop方法返回任意元素 我对此很满意 我想知道当集合具有相同的历史记录时 pop 是否总是返回相同的元素 当然 在一个版本的 python 中 我不介意 python 的不同版本 实现是否做
  • Coq 中 MSet 的使用示例

    MSets https coq inria fr library Coq MSets MSets html似乎是 OCaml 式有限集的最佳选择 可悲的是 我找不到示例用途 如何定义一个空的MSet或单身人士MSet 我怎样才能结合两个MS
  • 如何使用 set 维护列表的顺序?

    In 1 l1 a 2 3 0 9 0 0 2 6 b a In 2 l2 list set l1 In 3 l2 Out 3 a 0 2 3 6 9 0 b 在这里您可以看到列表 l2 的顺序与原始 l1 的顺序不同 我需要从列表中删除重
  • 如何在单个 SELECT 查询中设置多个 T-SQL 变量?

    我有3个变量 testid sampleid and clientid 我该如何设置 sampleid and clientid通过执行此查询一次 SELECT sample sampleid client clientid FROM db
  • hashMap、List 和 Set 的数据结构

    任何人都可以指导我深入了解所使用的数据结构以及它是如何在 Util Collection 页面的列表 集合和映射中实现的 在面试中 大多数问题都是关于算法的 但我从未在任何地方看到过实现细节 有人可以分享一下信息吗 要了解 Java 如何实
  • Python-从另一个列表中删除一组列表

    array1 1 2 3 4 5 6 7 8 9 array2 1 2 2 2 5 6 6 6 9 temp set array2 array1 remove temp Traceback most recent call last Fil
  • 创建“集合字典”

    我需要将数据有效地存储在类似于 集合字典 的东西中 例如有一个字典 其中包含与每个唯一键匹配的多个 唯一 值 我的数据源是一个 不是很好 结构化的 XML 我的想法是 我将浏览许多元素并找到关键 如果key不存在 则将其添加到字典中 如果已
  • Python 集合与列表

    在Python中 哪种数据结构更高效 更快 假设顺序对我来说并不重要 并且无论如何我都会检查重复项 那么 Python 集比 Python 列表慢吗 这取决于您打算用它做什么 在确定某个对象是否存在于集合中时 集合的速度要快得多 如x in
  • 在 pandas 系列上成对应用函数

    我有一个 pandas 系列 其元素构成 freezesets data 0 frozenset apple banana 1 frozenset apple orange 2 frozenset banana 3 frozenset ku
  • 为什么Python中set的大小可以比dict大?

    为什么a的大小是set比一个大dict s set d for i in range 20 s add i d i 1 print f i 1 s sizeof d sizeof Output 17 712 624 18 712 624 1
  • android 将自定义字体设置为油漆

    我想在油漆上绘制文字 如何用自定义字体绘制它 前 Helvetica 并且还粗体 我更愿意使用系统字体而不是从资源创建它 谢谢 如果 自定义字体 是指作为资源提供的字体 则以下代码应该有效 Typeface plain Typeface c
  • 执行 set_difference 时出错:变量结果不是结构

    我在函数外部全局声明了一个设置变量 std set
  • 如何在Linux中为特定程序设置进程ID

    我想知道是否有某种方法可以在运行某些应用程序之前强制使用 Linux 的某些特定进程 ID 我需要提前知道进程ID 实际上 有一种方法可以做到这一点 自内核 3 3 设置了 CONFIG CHECKPOINT RESTORE 在大多数发行版
  • 在 python 中对自定义类执行集合操作

    我想将 Python 的内置 set 类与我创建的自定义类一起使用 如果我愿意 要创建包含自定义类实例的集合 我需要实现哪些函数才能执行测试 例如 set a set b 它可以开箱即用 但是 在某些情况下 过载是有意义的 eq https
  • 使用 std::set 时重载运算符<

    这是我第一次使用 std set 容器 并且我对操作符 std less 遇到了问题 我声明该集合 std set
  • set() 可以在 Python 进程之间共享吗?

    我正在 Python 2 7 中使用多重处理来处理非常大的数据集 当每个进程运行时 它会将整数添加到共享的 mp Manager Queue 中 但前提是其他进程尚未添加相同的整数 由于您无法对队列进行 in 式成员资格测试 因此我这样做的
  • 如何正确删除动画集中引用的 Raphael SVG 元素?

    我有一组动画 Raphael SVG 元素 我正在通过用户发起的 ajax 调用添加新元素并删除旧元素 我 set push 新元素 但因为我需要删除的元素通常不是集合中的最后一个元素 所以我使用 element remove 而不是 se

随机推荐

  • Parse方法解析字符串

    今天才注意到Parse方法解析字符串时可以通过NumberStyles枚举和IFormatProvider接口分析字符串的格式
  • Qt的事件过滤器installEventFilter

    一 介绍 WPF中使用AddHandler来监听事件 那么QT呢 Qt的事件模型是使用一个QObject对象 来监视发送其他QObject对象的事件 在事件到达之前对其进行处理 这里要使用一个函数 void QObject installE
  • Typora主题推荐

    Typora主题推荐 官网 https theme typora io 以前我用的是github主题 现在是Drake 但是字体有点小 改了css 进行微调一下 1 cobalt主题 2 Drake主题 3 fluent主题 4 gitbo
  • 读《自己动手写操作系统》(于渊著)第一节

    最近开始看 自己动手写操作系统 虽然很早以前就读过一点点 但一直没有机会动手实践 本着光说不练假把式的原则 今天动手实践了开头的一部分 说得这么正经其实你就是看了一点点吧 囧 废话不多说 在这里做一个小小的总结 实验环境 操作系统 win7
  • python实现调用科大讯飞语音听写(将音频识别成文字输出)

    一 大致流程 1 申请科大讯飞账号 https passport xfyun cn register 2 创建应用 应用平台选择WebAPI 3 查看开发文档 4 根据开发文档和示例代码进行调试 二 申请科大讯飞账号 首先我们先去科大讯飞开
  • MySQL——通过binlog恢复数据

    目录 1 binlog基本概念 2 MySQL开启binlog 3 使用binlog日志恢复数据 3 1 恢复前准备工作 3 2 数据恢复 3 2 1 通过mysqlbinlog将binlog转为sql 以方便查询具体位置 3 2 2 查看
  • 零点分布对单位脉冲响应的影响

    共四个二阶网络的系统函数 画系统零极点分布图 求各系统单位脉冲响应 画波形 H1 clc clear all close all A 1 1 6 0 9425 B 1 0 0 figure zplane B A z roots B zero
  • DM8 用户与权限管理

    一 用户及权限管理 1 1 创建用户 create user test identified by Test 1234 default tablespace test 1 2 用户改密码 alter user SYSDBA identifi
  • 【战略布局】12.8黄金白银涨跌发展趋势-黄金原油走势操作建议

    黄金消息面与技术面解析 消息面 周三 12月8日 亚市盘中 黄金期货温和上涨 现报1789美元 盎司附近 稍早期金曾短暂突破1790美元 盎司关口 周二 12月7日 金价小幅上涨 主要是受到通胀预期和地缘局势担忧的支撑 投资者将注意力聚焦将
  • Xshell突然连接不上虚拟机的解决

    目录 问题描述 失败的尝试 最终解决 感想 问题描述 国庆节后继续学习 在使用Xshell登录虚拟机时突然登不上了 而且只有三台中的一台登不上 考虑到之前对虚拟机的配置是在一台win机器上使用VMware Workstation软件创建了三
  • 锐浪(Grid++Report)报表脚本通过某些字段隐藏控件

    var panduantj Report ParameterByName leix AsString 你的字段名 var xians Report ControlByName chuchai 获取图片控件 if panduantj 出差 x
  • wps合并重复项并求和_表格技巧—Excel中重复项求和的方法

    在Excel统计数据时 经常会碰到重复项反复出现 很干扰视线 想要对重复项进行合并并求和 那要如何操作呢 下面 小编跟大家详细讲解Excel合并重复项数据并求和的操作方法 首先打开一个需要处理的Excel表格 比如对下列表格中相同型号的数量
  • Scrapy中extract_first()和extract()的区别

    测试用到的爬取网站 In 11 print response xpath h3 a title scrapy selector unified SelectorList 是Selector组成的列表 Out 11 为了方便阅读换行符我手打的
  • python降低cpu的占用

    import signal import resource import os import time from multiprocessing import Process def time exceeded signo frame ti
  • 2023华为OD机试真题-工作安排(JAVA、Python、C++)

    题目描述 小明每周上班都会拿到自己的工作清单 工作清单内包含n项工作 每项工作都有对应的耗时时长 单位h 和报酬 工作的总报酬为所有已完成工作的报酬之和 那么请你帮小明安排一下工作 保证小明在指定的工作时间内工作收入最大化 输入描述 输入的
  • Qt 事件过滤器

    通过前面的学习 我们已经知道 Qt 创建了QEvent事件对象之后 会调用QObject的event 函数处理事件的分发 显然 我们可以在event 函数中实现拦截的操作 由于event 函数是 protected 的 因此 需要继承已有类
  • 2023最新Web前端经典面试试题及答案-史上最全前端面试题(含答案)

    近期总结一一些面试题 都是企业的面试题笔记题 感觉薪资10k 15k的常见面试题 个人录制的最新Vue项目学习视频 B站 Vue2 第二版 后台管理系统项目实战 vue element ui vue经典全套系统案例讲解 哔哩哔哩 bilib
  • python中的 datetime 的使用

    python 中 datetime 的使用方法 介绍 所谓 datetime 其实就是 date time date 和 time的集合 下面介绍使用方法 常搭配logging记录日志 date from datetime import d
  • 三创赛优秀作品_三创赛优秀作品.doc

    PAGE PAGE 138 全国高校首届 创意 创新 创业 电子商务挑战赛 农舍吧 电子商务旅游网站 参赛策划书 北京邮电大学 开心吧 电子商务团队 团队成员 吴新军 林朝波 高有富 陈和磊 指导老师 胡 桃 2009年12月 TOC o
  • Map 和 Set 使用的区别和联系(建议收藏)

    我是目录 1 搜索 1 概念及场景 2 模型 2 Map 的使用 3 Set 的使用 表现 两个接口 Set 和 Map 接口 1 搜索 1 概念及场景 Map 和 set 是一种专门用来进行 搜索的容器 或者 数据结构 其搜索的效率与其具