数据结构,Map和Set的使用方法

news2024/12/23 8:22:15

在数据结构中我们经常会使用到 Map 和 Set ,Map 和 Set 到底是什么,它怎样去使用呢?因此博主整理出 Map 和 Set 这两个接口的介绍与使用方法。

目录

1. 啥是Map和Set?

1.1 Map和Set的模型

2. Map的使用

2.1Map的说明

2.2 Java中Map常用的方法

3. Set的使用

3.1Java中Set的常用方法 

1. 啥是Map和Set?

Map 和 Set 是一种专门用来搜索的一个容器或数据结构,它的用途就是为了更快捷、有效的增删改查数据。

在之前的学习中,大家查找数据并对数据进行增删改查基本上使用的都是for循序这种直接遍历的方式,其时间复杂度为O(N),元素如果比较多效率会非常慢。这样的查找是静态的查找。而 Map 和 Set 是实现动态查找的一个集合结构。

通过上图我们可以看到,Set 接口和 Map 接口。底层都有 HashMap 和 TreeMap 使用了这个接口,因此我们把 Map 和 Set 一起来讲。


1.1 Map和Set的模型

通常我们把查找的数据称为关键字 Key关键字Key对应的值为Value。只有单独的关键字Key我们称为 Key 模型,Key 与 Value 组合的模型我们称之为 键值对。因此有两种解释: 

(1)Key模型

Key模型的思想类似于一个快速查询,如在一个数组查找值为Key的元素。Set存储的就是Key模型,其语法格式为:Set<Key>。通过下方程序理解:

public class Test {
    public static void main(String[] args) {
        Set<Integer> set = new HashSet<>();
        set.add(1);//添加Key值为1
        set.add(6);//添加Key值为6
        System.out.println(set);//输出set集合
    }
}

输出: 


(2)Key与Value模型

Key与Value,类似于起绰号,如林冲对应的绰号为“豹子头”(Map<林冲,豹子头),罗翔口中的张三对应的绰号为“法外狂徒”(Map<张三,法外狂徒>)。Map中存储的是就是Key-Value的键值对,其语法格式为:Map<Key,Value>。对应下方代码来理解:

public class Test {
    public static void main(String[] args) {
        Map<Character,Integer> map = new HashMap<>();
        map.put('A',6);
        map.put('G',3);
        System.out.println(map);//输出map集合
    }
}

输出: 


2. Map的使用

通过上方 Map 和 Set 的模型我们知道了,Map 中存储的是一个<Key,Value>的键值对结构。那么Map 它是一个接口,底层有 HashMap 和 TreeMap 使用了这个接口。

因此,我们不能直接实例化(new)一个Map对象,SortedMap也是一个接口,也不能实例化。但可以实例化 Map 底层的HashMap和TreeMap。因此,我们使用 Map 来操作数据时,使用的就是HashMapTreeMap 了。


2.1Map的说明

在 Map 这个集合中,Map 中 Key 值是唯一的,Value 值可不唯一,借助以下代码来理解:

    public static void main(String[] args) {
        Map<Character,Integer> map = new HashMap<>();
        map.put('A',3);//键值对A,3
        map.put('B',3);//键值对B,3
        map.put('A',6);//键值对A,6
        System.out.println(map);//输出map集合
}

输出

通过输出结果我们发现到,第一行的键值对A,3没有输出。只输出了第二行键值对 B,3 和第三行的键值对 A,6。因此我们可以确定 Map 集合中Key值 唯一、Value值不唯一


2.2 Java中Map常用的方法

方法返回类型及参数类型说明
get()get(Object key)返回key对用的value
getOrDefault()getOrDefault(Object key, V defaultValue)返回key对应的value,key不存在时返回默认值
put()put(K key, V value)设置key对应的value
remove()remove(Object key)删除key对应的映射关系
keySet() Set<K> keySet() 返回所有key的不重复集合
values() Collection<V> values() 返回所有的value的可重复集合
entrySet()  Set<Map.Entry<K, V>> entrySet()返回所有的key,value映射关系
containsKey(Object key) boolean containsKey(Object key)判断是否包含key
containsValue(Object value) boolean containsValue(Object value)判断是否包含value

以下为这些方法的实例演示:

public static void main(String[] args) {
        //实例化一个HashMap对象为map这个集合
        Map<Character,Integer> map = new HashMap<>();
        //put方法
        map.put('A',3);//put方法给map集合添加键值对A,3
        map.put('B',3);//put方法给map集合添加键值对B,3
        System.out.println("put两个键值对后map集合为: "+map);
        System.out.println("输出A对应的value值: "+map.get('A'));//get方法
        System.out.println("输出C对应的value值没有则输出默认值666: "+map.getOrDefault('C', 666));
        //remove方法
        map.remove('A');
        System.out.println("删除A后的map集合为: "+map);
        //keySet方法
        System.out.println("map集合中Key不重复值组成的集合: "+map.keySet());
        //entrySet方法
        System.out.println("map集合中的所有Key=Value映射(键值对)关系:"+map.entrySet());
        //containsKey方法
        System.out.println("判断map集合中是否包含Key为A的值: "+map.containsKey('A'));
        //containsValue方法
        System.out.println("判断map集合中是否包含Value为3的值: "+map.containsValue(3));
    }

输出以下内容:

当然,以上的实例是以实例化HashMap的对象来完成的,大家可以尝试使用TreeMap来完成以上方法。 


通过上方所有知识点的学习,我们能总结以下几点:

  1. Map是一个抽象类,不能被实例化,只能实例化底层的HashMap和TreeMap
  2. Map中存储的键值对Key是唯一的,Value是不唯一的
  3. Map中的Key可以全部分离出来,存储在Set中的任何一个子集合中(通过Set<K> keySet()方法)。因为Key不能重复!
  4. Map中的Value也可以全部分离出来,存储在Collection的任何一个子集合中(通过方法Collection<V> values()方法),因为Value可以重复!
  5. Map中的键值对Key值不能直接修改,Value可修改,如果要修改Key只能先删除Key值再重新插入。

3. Set的使用

通过上方学习,我们知道了Set 与 Map 主要的不同有两点:Set是继承自 Collection 的接口类,Se t中只存储了 Key


3.1Java中Set的常用方法 

方法返回类型及参数类型说明
add()boolean add(E e)添加元素,但重复元素不会被添加成功
clear()void clear()清空集合
contains()boolean contains(Object o) 判断 o 是否在集合中
iterator()Iterator<E> iterator() 返回迭代器
remove()boolean remove(Object o) 删除集合中的 o
size()int size()返回set中元素的个数
isEmpty()boolean isEmpty()检测set是否为空,空返回true否则返回false
toArray()Object[] toArray()将set中的元素转换为数组返回
containsAll()boolean containsAll(Collection<?> c)集合c中的元素是否在set中全部存在,是返回true否则返回false
addAll()boolean addAll(Collection<? extends
E> c)
将集合c中的元素添加到set中,可以达到去重效果

以下为各个方法的实例测试:

public static void main(String[] args) {
        Set<Integer> set = new HashSet<>();
        set.add(10);//添加元素10
        set.add(12);//添加元素12
        //打印set集合
        System.out.println(set);
        //判断11是否在set集合中
        System.out.println(set.contains(11));
        //返回迭代器
        System.out.println(set.iterator());
        //删除集合中的10
        set.remove(10);
        //打印set集合
        System.out.println(set);
        //输出set集合大小
        System.out.println(set.size());
        //判断set是否为空,空返回true否则返回false
        System.out.println(set.isEmpty());
        //将set集合转换为数组的形式
        System.out.println(Arrays.toString(set.toArray()));
    }

输出:

因此,我们可以总结以下7点: 

  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。

当然了,我们掌握了 Map 和 Set 的使用方法后还需要了解的是,在 Map 和 Set 的底层 TreeMap 的结构为红黑树,HashMap 的结构为哈希桶。TreeMap 的查找速度O(log2N),HashMap的查找速度为O(1)。感兴趣的伙伴可以在下方专栏中搜索 TreeMap 和 HashMap 的区别


🧑‍💻作者:程序猿爱打拳,Java领域新星创作者,阿里云社区博客专家。

🗃️文章收录于:数据结构与算法

🗂️JavaSE的学习:JavaSE

🗂️MySQL数据库的学习: MySQL数据库

🆕没有对象的朋友赶快给自己new一个对象吧~


本期博文到这里就结束了,如有收获还请关注走一波,感谢您的阅读~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/463250.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】列表初始化声明范围forSTL容器新变化

文章目录 什么是C11列表初始化**C98中{}的初始化**内置类型的列表初始化 关于initializer_list使用场景: 声明auto-变量类型推导decltype类型推导nullptr 范围forSTL的新变化新容器:容器中的一些新方法 什么是C11 在2003年C标准委员会曾经提交了一份技术勘误表(简称TC1),使得C…

Java 输出机制 数据类型

目录 一、输出机制 1.print和println的差别 2.可接收不同类型参数 3.输出函数中 符号的使用 二、Java 数据类型 1.整型类型 2.浮点类型 3.字符类型 三、基本数据类型转换 1.自动类型转换 2.强制类型转换 3.练习题 四、基本数据类型和String类型的转换 1.基本类…

【LeetCode】 309.最佳买卖股票时机含冷冻期

309.最佳买卖股票时机含冷冻期&#xff08;中等&#xff09; 思路 状态定义 一、很容易想到四种状态&#xff1a; a.今天买入&#xff1b;b.今天卖出&#xff1b;c.昨天卖出&#xff0c;今天处于冷冻期&#xff0c;无法进行操作&#xff1b;d.今天不操作&#xff0c;处于持有…

SD卡变成RAW格式怎么办?SD卡RAW格式的解决办法

使用SD卡的小伙伴有没有遇到这种情况&#xff0c;SD卡无法访问提示格式化&#xff0c;查看SD卡的属性发现文件系统类型变成RAW格式&#xff0c;而非之前的NTFS或FAT32格式。那么当SD卡变成raw格式怎么办&#xff1f;如果里面有重要数据怎么办&#xff1f;SD卡RAW格式怎么恢复数…

【Java】什么是SOA架构?与微服务有什么关系?

文章目录 服务化架构微服务架构 我的一个微服务项目&#xff0c;有兴趣可以一起做 服务化架构 我们知道&#xff0c;早期的项目&#xff0c;我们都是把前后端的代码放在同一个项目中&#xff0c;然后直接打包运行这个项目&#xff0c;这种项目我们称之为单体项目&#xff0c;比…

m4a怎么转换成mp3的4种方法值得收藏

m4a怎么转换成mp3&#xff1f;首先我们得了解m4a是什么格式。m4a是MPEG-4音频标准的文件扩展名&#xff0c;它是一种音频格式&#xff0c;由苹果公司推出。该格式的音质没有损失&#xff0c;且不受版权保护&#xff0c;因此可以进行自由编辑和转发。该格式的兼容性相对较弱&…

PIE-SAR软件自动化编译与发布

1.背景 SVN版本控制下多人协调编写代码&#xff0c;会经常性的提交新功能&#xff0c;修改完善已有功能。产品经理、测试人员需定期回归测试&#xff0c;确保禅道Bug已经修复&#xff0c;这就需要经常性地打包软件。为了节省编译时间&#xff0c;也方便产品经理可随时去取最新…

MiniGPT-4,开源了!

上个月GPT-4发布时&#xff0c;我曾写过一篇文章分享过有关GPT-4的几个关键信息。 当时的分享就提到了GPT-4的一个重要特性&#xff0c;那就是多模态能力。 比如发布会上演示的&#xff0c;输入一幅图&#xff08;手套掉下去会怎么样&#xff1f;&#xff09;。 GPT-4可以理解…

基于51单片机的差分双路电压检测(基于ADC0832)

文章目录 前言一、本文任务二、材料三、电路图四、代码解读1.引脚定义及参数2.定时器中断与延时开启3.数码管显示定义及ADC0832函数初始化4.数据转换及数码管显示5.主函数及定时器函数6.所有代码&#xff08;就一个c文件&#xff09; 总结 前言 博主终于又空出时间啦&#xff…

二战失利,剩下的路?

作者&#xff1a;阿秀 校招八股文学习网站&#xff1a;https://interviewguide.cn 这是阿秀的第「260」篇原创 小伙伴们大家好&#xff0c;我是阿秀。 欢迎今年参加秋招的小伙伴加入阿秀的学习圈&#xff0c;目前已经超过 2300 小伙伴加入&#xff01;去年认真准备和走下来的基…

如何使用chatGPT生成小红书种草文案

如何使用chatGPT生成小红书种草文案 小红书拥有超千万的日活用户&#xff0c;为商家提供了广阔的变现空间和机会&#xff0c;成为商家选择在小红书上推广的原因之一。 小红书种草文案&#xff0c;例如具有影响力的热门话题、产品使用方法等内容可以让消费者迅速了解产品为品牌…

小米青春版路由器刷openwrt

下载小米路由器R1CL开发版 通过手动上传更新&#xff0c;更改固件版本 将之前地址栏URL中的 /web/home#router 替换为&#xff08;密码为admin&#xff09; /api/xqsystem/set_name_password?oldPwd123456789&newPwdadmin如果网页返回 {“code”:0} &#xff0c;则说明修…

JAVA的BIO、NIO、AIO模式精解(一)

1. BIO、NIO、AIO介绍 在不同系统或进程间数据交互&#xff0c;或高并发场景下都选哟网络通信。早期是基于性能低下的同步阻塞IO(BIO)实现。后支持非阻塞IO(NIO)。 前置须知&#xff1a;javsse&#xff0c;java多线程&#xff0c;javaIO&#xff0c;java网络模型 目的&#xf…

[江西专升本/信息技术]计算机网络基础

1、概论 目前主要从资源共享观点定义计算机网络&#xff1a; 用通信路线和通信设备将分布在不同地点的具有独立功能的多个计算机系统相互连接起来&#xff0c;在功能完善的网络软件的支持下实现彼此之间的数据通信和资源共享的系统&#xff1b; 我们可以这么说&#xff0c;“…

effective c++ item30-34

item30:理解inline 1、inline函数 用inline修饰函数可以防止multiple definition的错误 // foo.h inline int foo(int x){ // 如果不加inline&#xff0c;在编译时会有两个foo.h被包含进去&#xff0c;导致链接出错static int n 1;return x * (n ); } // bar1.cpp #includ…

【车道线算法】GANet-车道线检测环境配置一文通关

目录 GANet配置全纪录 下载代码 conda环境部署 安装torch和cudatoolkit 安装其他包 编译 总结 GANet配置全纪录 下载代码 GitHub - Wolfwjs/GANet: A Keypoint-based Global Association Network for Lane Detection. Accepted by CVPR 2022 进入代码网址的默认master…

ArcGIS Pro工程

目录 1 工程基础架构 2 工程内容 3 新建工程及工程文件 3.1 工程模板 3.2 工程名称和位置 3.2.1 基于“地图模板”创建新工程 3.2.2 基于“目录模板”创建新工程 3.2.3 基于“全局场景”创建新工程 3.2.4 基于“局部场景”创建新工程 3.3 工程文件 3.3.1 默认地理…

子元素选择器

知识点&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta http-equiv"X-UA-Compatible" content"IEedge"> <meta name"viewport" c…

【MySQL高级】——用户与权限管理

一、用户管理 <1> 登录 mysql –h hostname|hostIP –P port –u username –p DatabaseName –e "SQL语句"-h参数 后面接主机名或者主机IP&#xff0c;hostname为主机&#xff0c;hostIP为主机IP。 -P参数 后面接MySQL服务的端口&#xff0c;通过该参数连接…

序列检测和序列发生器——verilog代码实现

文章目录 前言一、序列检测器1.1 重复序列检测1.1.1 序列缓存对比/移位寄存器法1.1.2 状态机法 1.2 非重复序列检测 二、序列发生器2.1 移位寄存器法2.2 反馈法2.3 计数器法 前言 2023.4.25 2023.4.26 学习打卡&#xff0c;天气转晴 一、序列检测器 1.1 重复序列检测 1.1.1 …