数据结构————map,set详解
今天带来map和set的详解,保证大家分清楚
一,概念
map和set是一种专门用来搜索的容器或数据结构
map能存储两个数据类型,我们称之为<key-value>模型
set只能存储一个数据类型,我们称之为纯<key>模型
它们的效率都非常非常高,我们来一个一个了解。
二,详解map
1,map的说明
map是一个接口,所以我们不能直接创建map对象,我们可以使用Treemap和HashMap,我们先不讲treemap和Hashmap底层是怎么实现的,我们先只需要了解他们怎么使用就行(后期还是要学),treeMap的底层是使用红黑树来实现的,而Hashmap底层是哈希表,哈希表由一系列哈希桶组层,也很难,后期要掌握。
2,map中的具体方法
V put(K key, V value) 设置 key 对应的 value
开头V的意思是返回value的类型。
这个方法是添加元素,注意,实现的对象在treemap的时候k是不可以存null的,而Hashset是可以存null的,因为treemap底层的红黑树涉及比较,而Hashset主要是根据哈希函数查找,
key值如果相同的话,后添加的会把map中已经存在的key值对应的value覆盖掉,而不同key值间的value是可以相同的。
Map<String,Integer> map = new HashMap<>();map.put("ujm",12321);map.put("abs",12321);map.put("tdh",12321);map.put("yre",12321);
我们来向map中添加键值对,来调试
成功添加了键值对。
V remove(Object key) 删除 key 对应的映射关系
map中的删除方法,map中的key值是不可以修改的,只能进行删除操作,之后再重新修改。
map.remove("ujm");map.remove("abs");map.remove("tdh");map.remove("yre");
我们看到了map中不含任何元素了。
V get(Object key) 返回 key 对应的 value
我们使用get方法来获取key———对应的value值,就是我们的查找了。
我们查找刚才添加元素的abs.
int a = map.get("abs");System.out.println(a);
我们成功找到了abs字符串
V getOrDefault(Object key, V defaultValue) 返回 key 对应的 value,key 不存在,返回默认值
但是我们这次如果没有找到对应的key,就返回我们设定的值
int a = map.getOrDefault("bswr",1000);System.out.println(a);
Set keySet()返回所有 key 的不重复集合
我们用keySet()方法来获得map中的所有key
Map<String,Integer> map = new HashMap<>();map.put("ujm",12321);map.put("abs",12321);map.put("tdh",12321);map.put("yre",12321);Set<String> set = map.keySet();
那么value呢
Collection values()返回所有 value 的可重复集合
我们用这个方法来获得所有的value
Map<String,Integer> map = new HashMap<>();map.put("ujm",12321);map.put("abs",12321);map.put("tdh",12321);map.put("yre",12321);Collection<Integer> collection = map.values();
Map.Entry<k,v>
这是map中提供的一个获取键值对的类,我们可以通过这个类来获得k,v的值,我们还可以将v替换成其他的v值,我们经常使用这个类来遍历的打印键值对。
这个类中有三个方法,
K getKey() 返回 entry 中的 key
V getValue() 返回 entry 中的 value
V setValue(V value) 将键值对中的value替换为指定value
这里先不介绍。
Set<Map.Entry<k,v>> entrySet() 返回所有的 key-value 映射关系
我们创建一个set类型,Set类型的具体数据类型是我们的键值对类型,我们对map进行.entry Set() 传给我们的set类型,我们就得到我们所有的键值对关系,这个是最重要的。
Map<String,Integer> map = new HashMap<>();map.put("ujm",4647);map.put("abs",123);map.put("tdh",1351);map.put("yre",6856);Set<Map.Entry<String,Integer>> set = map.entrySet();for (Map.Entry<String,Integer> entry1 : set){System.out.println(entry1);}
我们使用for each遍历,
成功打印所以的键值对。
boolean containsKey(Object key) 判断是否包含 key
在map中找key,找到返回true,没有返回false
boolean a = map.containsKey("abs");System.out.println(a);a = map.containsKey("scawcw");System.out.println(a);
boolean containsValue(Object value)判断是否包含 value
在map中找value,找到返回true,没有返回false
boolean b = map.containsValue(123);System.out.println(b);b = map.containsValue(213124);System.out.println(b);
Map底层结构 | TreeMap | HashMap |
底层结构 | 红黑树 | 哈希桶 |
插入/删除/查找时间 复杂度 | O(log2n) | O(1) |
是否有序 | 关于key有序 | 无序 |
线程安全 | 不安全 | 不安全 |
插入/删除/查找区别 | 需要进行元素比较 | 需要哈希函数计算地址 |
比较与覆写 | 不可以放null会抛异常 | 需要覆写HashCode和equals函数 |
应用场景 | key有序最好 | 不关心,开辟大量内存换取时间 |
三,详解set
1.set的说明
Set也是一个接口,我们要想创建对象就要使用TreeSet,HashSet,Set是纯key模型,不能重复,我们常常使用Set来去重。
2.set中的具体方法
boolean add(E e) 添加元素,但重复元素不会被添加成功
向set中添加元素,set中的key不能重复
Set<Integer> set = new HashSet<>();set.add(13);set.add(46);set.add(768);
我们看到set中成功添加了三个元素
void clear() 清空集合
set.add(13);set.add(46);set.add(768);set.add(2);set.clear();
boolean contains(Object o) 判断 o 是否在集合中
Set<Integer> set = new HashSet<>();set.add(13);set.add(46);set.add(768);set.add(2);boolean a = set.contains(12);boolean b = set.contains(2);System.out.println(a + " " + b);
boolean remove(Object o)
set.remove(13);
移除13。
Iterator iterator() 返回迭代器
这个方法我们主要用来遍历打印我们的Set,因为set实现了我们的Iterator接口
Iterator<Integer> iterator = set.iterator();while (iterator.hasNext()){System.out.println(iterator.next());}
其他方法
Set底层结构 | TreeSet | HashSet |
底层结构 | 红黑树 | 哈希桶 |
插入/删除/查找时间 复杂度 | O(log2n) | O(1) |
是否有序 | 关于key有序 | 无序 |
线程安全 | 不安全 | 不安全 |
插入/删除/查找区别 | 需要进行元素比较 | 需要哈希函数计算地址 |
比较与覆写 | 不可以放null会抛异常 | 需要覆写HashCode和equals函数 |
应用场景 | key有序最好 | 不关心,开辟大量内存换取时间 |
四,练题
好了,终于讲完我们的基础了,我们来三道小练习题
1给一组元素,统计元素出现的次数 2给定一组元素去重 3找到一组数据中第一个重复的数据
1, 给一组元素,统计元素出现的次数
int[] arr = new int[]{23,352,46,47,84,1,44,6,1,23};Map<Integer,Integer> map = new HashMap<>();for (int i = 0; i < arr.length; i++) {if(map.get(arr[i])==null){map.put(arr[i],1);}else {map.put(arr[i], map.get(arr[i])+1);}}Set<Map.Entry<Integer,Integer>> set = map.entrySet();for (Map.Entry<Integer,Integer> entry: set){System.out.println(entry);}
2,给定一组元素去重
int[] arr = new int[]{23,352,46,47,84,1,44,6,1,23};Set<Integer> set = new HashSet<>();for (int i = 0; i < arr.length; i++) {set.add(arr[i]);}Iterator<Integer> iterator = set.iterator();while (iterator.hasNext()){System.out.println(iterator.next());}
3,找到一组数据中第一个重复的数据
int[] arr = new int[]{23,352,46,47,84,1,44,6,1,23};Set<Integer> set = new HashSet<>();for (int i = 0; i < arr.length; i++) {if (!set.contains(arr[i])){set.add(arr[i]);}else {System.out.println(arr[i]);return;}}
相关文章:
数据结构————map,set详解
今天带来map和set的详解,保证大家分清楚 一,概念 map和set是一种专门用来搜索的容器或数据结构 map能存储两个数据类型,我们称之为<key-value>模型 set只能存储一个数据类型,我们称之为纯<key>模型 它们的效率都非…...
fdisk - Linux下的磁盘分区利器
文章目录 前言一、安装和启动二、基本命令2.1 查看分区表2.2 删除分区2.3 创建新分区2.4 更改分区类型2.5 其他指令 三、注意事项四、其他相关工具 前言 在Linux系统中,磁盘管理是维护系统性能和数据安全的重要环节。fdisk 是一个强大的命令行工具,专门…...
or-tools优化库记录
介绍 Or-tools是谷歌人工智能系列的运筹优化包,是一个用于优化的开源软件套件,针对性地解决车辆路线问题、流程优化、整数和线性规划以及约束规划等问题。 官网地使用说明比我详细,我就不多逼逼了 使用说明网址: https://develo…...
M1 Pro MacBook Pro 上的奇遇:Rust 构建失败,SIGKILL 惊魂记
你是否也曾在 M1 Pro MacBook Pro 上遇到过离奇的编译问题?这次我遇到的奇葩问题绝对值得一聊——一个仅在苹果M1 Pro上的神秘构建失败。其他设备都安然无恙,唯独它!折腾了一番,终于让我揭开了这“阴谋”的真相。 问题描述 在运…...
重构商业生态:DApp创新玩法与盈利模式的深度剖析
随着区块链技术的发展,DApp(去中心化应用)正在从实验走向成熟。DApp以去中心化、透明性和不可篡改性为基础,结合智能合约,逐步改变传统商业运作模式,创造新的市场生态。本文将从DApp的独特优势、创新玩法和…...
2024首届亚洲国际电影节圆满落下帷幕
10月26日下午,2024首届亚洲国际电影节颁奖典礼在中国•澳门隆重举行。在这座充满时尚感的“东亚文化之都”,一座座金鹮奖杯,汇聚起全球电影艺术的荣耀之光,见证着无数电影梦想的傲然绽放。明星云集欢聚一堂,同庆澳门回…...
【Mybatis】动态SQL+配置文件+数据库连接池+企业规范(10)
本系列共涉及4个框架:Sping,SpringBoot,Spring MVC,Mybatis。 博客涉及框架的重要知识点,根据序号学习即可。 目录 本系列共涉及4个框架:Sping,SpringBoot,Spring MVC,Mybatis。 博客涉及框架的重要知识点,根据序号学习即可。 …...
layui扩展组件之----右键菜单
源码:rightmenu.js layui.define([element], function (exports) {let element layui.element;const $ layui.jquery;let MOD_NAME rightmenu;let RIGHTMENUMOD function () {this.v 1.0.0;this.author raowenjing;};String.prototype.format function () {…...
ue5实现数字滚动增长
方法1 https://www.bilibili.com/video/BV1h14y197D1/?spm_id_from333.999.0.0 b站教程 重写loop节点 方法二 写在eventtick里...
Flink(一)
目录 架构处理有界与无界数据部署应用到任意地方运行任意规模应用利用内存性能 流应用流处理应用的基本组件流状态时间 应用场景事件驱动应用事件驱动应用的优势Flink如何支持事件驱动应用? 典型的事件驱动示例 数据分析应用流式分析应用的优势?Flink 如…...
kaggle 数据集下载
文章目录 kaggle 数据集下载(1) 数据集下载(2) 手机号验证 kaggle 数据集下载 这两天想学习 kaggle 赛事 把深度学习相关的内容自己给过一遍,快忘得差不多了,惭愧。 参考了好多帖子,使用命令行…...
Linux shell编程学习笔记87:blkid命令——获取块设备信息
0 引言 在进行系统安全检测时,我们需要收集块设备的信息,这些可以通过blkid命令来获取。 1 blkid命令的安装 blkid命令是基于libblkid库的命令行工具,可以在大多数Linux发行版中使用。 如果你的Linux系统中没有安装blkid命令,…...
wireshark筛选条件整理
Wireshark筛选条件整理 一、MAC地址过滤二、IP地址过滤三、端口过滤四、协议筛选五、数据分析1、整体2、frame数据帧分析3、 Ethernet II 以太网4、IP协议5、TCP6、HTTP7、ARP8、DLEP动态链接交换协议 六、统计-协议分级(统计包占比) and && 、 …...
基于现代 C++17 的模块化视频质量诊断处理流程设计
文章目录 0. 引言1. 原始设计分析2. 新的设计思路2.1 定义通用的检测接口2.2 使用 std::function 和 std::any 管理检测模块2.3 构建可动态配置的检测管道 3. 示例实现3.1 定义检测接口和模块3.1.1 检测接口3.1.2 信号检测模块3.1.3 冻结检测模块3.1.4 其他检测模块 3.2 构建检…...
高级java每日一道面试题-2024年10月23日-JVM篇-说一下JVM有哪些垃圾回收算法?
如果有遗漏,评论区告诉我进行补充 面试官: 说一下JVM有哪些垃圾回收算法? 我回答: 在 Java 虚拟机 (JVM) 中,垃圾回收 (Garbage Collection, GC) 是一项非常重要的功能,用于自动管理应用程序的内存。JVM 采用多种垃圾回收算法来决定何时以及如何回收…...
高效文本编辑与导航:Vim中的三种基本模式及粘滞位的深度解析
✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…...
w005基于Springboot学生心理咨询评估系统
🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板ÿ…...
实战-任意文件下载
实战-任意文件下载 1、开局 开局一个弱口令,正常来讲我们一般是弱口令或者sql,或者未授权 那么这次运气比较好,直接弱口令进去了 直接访问看看有没有功能点,正常做测试我们一定要先找功能点 发现一个文件上传点,不…...
PG数据库之视图详解
1. 视图的基本定义 在PostgreSQL(简称pg)数据库中,视图(View)是一种虚拟表,其内容由SQL查询定义。视图并不实际存储数据,而是在每次查询时根据定义的查询语句动态生成结果。视图可以简化复杂的…...
时间序列预测(十五)——有关Python项目框架的实例分析
#1024程序员节|征文# 在之前的学习中,已经对时间序列预测的相关内容有了大致的了解。为了进一步加深理解,并能够将所学知识应用于实际中,我决定找一个完整的Python框架来进行深入学习。经过寻找,我终于找到了一篇非常具…...
ETL、ELT和反向ETL都有什么不同?怎么选择?
数据处理是现代企业中不可或缺的一部分。随着数据量的不断增长,如何高效地处理、转换和加载数据变得尤为重要。本文将介绍三种常见的数据处理方式:ETL、ELT和反向ETL,帮助读者更好地理解和选择适合自己业务需求的方式。 一、ETL 定义&#…...
linux 中文实用型手册 基于RHEL(红帽系)
硬件系统 Updated by wangjing on 2024-10-28 at 02:36:57 in Tongzhou District, Beijing. 硬件信息 机器型号 dmidecode | grep "Product Name"CPU型号 cat /proc/cpuinfo |grep "model name" | uniqWWWCPU详情 lscpuCPU个数 cat /proc/cpuinfo |grep &q…...
Hash表算法
哈希表 理论知识(本文来自于代码随想录摘抄)什么是哈希常见的三种哈希结数组:set:map:其他常用方法或者技巧(自己总结的) 练习题和讲解有效的字母移位词349. 两个数组的交集1. 两数之和454. 四数相加 II15. 三数之和 总…...
MySQL企业常见架构与调优经验分享
文章目录 一、选择 PerconaServer、MariaDB 还是 MYSQL二、常用的 MYSQL 调优策略三、MYSOL 常见的应用架构分享四、MYSOL 经典应用架构 观看学习课程的笔记,分享于此~ 课程:MySQL企业常见架构与调优经验分享 mysql官方优化文档 调优MySQL参数 一、选择 …...
C++引用类型变量
引用变量的主要用途是用作函数的形参。这样函数将使用原始数据,而不是副本。除指针之外,引用也为处理大型结构提供了一种非常方便的途径。 再C中使用&符号标识引用。也就是说C给&符号赋予了另一个含义,将其用来声明引用。 引用的声…...
《C++23 新特性:现代软件开发的变革力量》
在软件开发的快速演进中,C作为一种强大且广泛应用的编程语言,不断推陈出新以适应日益复杂的开发需求。C23 的到来,为现代软件开发带来了诸多新的机遇和挑战。它的新特性不仅影响着开发者的编程习惯,也在代码效率、可维护性以及软件…...
Educational Codeforces Round 88 E. Modular Stability
题目链接 Educational Codeforces Round 88 E. Modular Stability 思路 对于任意的非负整数 x x x,我们要满足 x % a % b x % b % a x \% a \% b x \% b \% a x%a%bx%b%a。因为 a < b a < b a<b,所以只有 b b b为 a a a的倍数时才满足条件…...
Android中SurfaceView与GLSurfaceView 的关系
SurfaceView 与 GLSurfaceView 的关系 在 Android 开发中,SurfaceView 和 GLSurfaceView 是实现自定义渲染效果的关键组件。它们提供了不同的渲染方式,适用于不同的应用场景。我们将通过以下几个方面详细说明 SurfaceView 和 GLSurfaceView 的特点及实现…...
numpy——数学运算
一、标量——矢量 import numpy as npa 3.14 b np.array([[9, 5], [2, 7]])print(a) print(b)# ---------- 四则运算 ---------- print(a b) # np.add print(a - b) # np.subtract print(a * b) # np.multiply print(a / b) # np.divide 二、矢量——矢量 import nump…...
【工具】Charles对360浏览器抓包抓包
Charles 和 switchy sharp 配合,可以对 Chrome 进行抓包也可以配合对360安全浏览器抓包。 本文以Windows 电脑中的配置为例,介绍如何实现抓包。(Mac中操作基本一致) 1.安装Charles 可根据自己的电脑下载对应的版本:…...
培训加盟/seo网络推广机构
9月28日,在上海市经济和信息化委指导下,由上海市黄浦区科学技术委员会、上海市社会信用促进中心、中国人保金融服务有限公司和中国中小企业协会联合主办的“信用大数据创新应用大赛启动仪式”举行。上海市经济和信息化委员会副主任张英通过视频方式为本次…...
做网站编码/seo推广技术
1, Java的基本部分 1.1 java中int数据占几个字节 1.2 有了基本类型, 为什么还需要包装类型? 1.3 说一下""和equals方法的区别? 1.4 讲一下String和StringBuilder的区别(final)?StringBuffer和StringBuilder的区别? 1.5, 讲一下java中的集合? 1.6 Ar…...
wordpress页面加载时间代码/网站关键词优化wang
最近我不得不在 Laravel 7 实现 通用唯一识别码 ( UUIDs ),并遇到一些问题。我希望这帖子可为其他正在做相同事情的人解惑。 使用 UUIDs 的高级理由 A) 它们从你的 统一资源定位符 移除编号的 身份识别号 ,故用户不能看到你的应…...
网站关键词代码怎么做/百度浏览器app
来源 :http://www.cnblogs.com/excelib/p/5150647.html 原文地址:http://www.excelib.com/article/287/show firewalld简介 Centos7中默认将原来的防火墙iptables升级为了firewalld,firewalld跟iptables比起来至少有两大好处: 1、…...
甘孜州住房城乡建设局网站/2023b站免费推广入口
“private是私有的,其他类是不能访问的,子类也不可以访问,所以你可以重新实现父类的该方法,不会有冲突,但是你重新实现的方法,不叫重写也不叫重载,是一个该子类新增的方法,和子类的一般扩展方法一样” public class A {private void print() {System.out.println("A"…...
wordpress如何发布文件夹/深圳seo公司助力网络营销飞跃
逆置打印字符串是有很多种方法的,个人感觉使用递归的方式很可以很容易的去理解栈的创建与析构,所以就稍微建立了模型;首先我们先看看理论:递归模型:1. 递归模型即是对自己本身的调用,一般用在函数或子函数函…...