Java -数据结构,Map Set

news2024/11/28 20:43:58

一、搜索

1.1、概念及场景

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

  1. 直接遍历,时间复杂度为O(N),元素如果比较多效率会非常慢
  2. 二分查找,时间复杂度为log 2为底的N ,但搜索前必须要求序列是有序的
    上述排序比较适合静态类型的查找,即一般不会对区间进行插入和删除操作了,而现实中的查找比如:
  3. 根据姓名查询考试成绩
  4. 通讯录,即根据姓名查询联系方式
  5. 不重复集合,即需要先搜索关键字是否已经在集合中
    可能在查找时进行一些插入和删除的操作,即动态查找,那上述两种方式就不太适合了,本节介绍的Map和Set是 一种适合动态查找的集合容器

1.2、模型

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

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

二、Map 的使用

Map官方文档
在这里插入图片描述

2.1、关于Map的说明

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

2.2、关于Map.Entry<K, V>的说明

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

在这里插入图片描述

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

2.3、Map 的常用方法说明

在这里插入图片描述

2.3.1、put(k key, v value) – 设置key 对应的value值

public static void main(String[] args) {
        Map<String,Integer> map = new HashMap<>();
        map.put("hello",2);
        map.put("bit",4);
        map.put("wwww",3);
        System.out.println(map);
    }

在这里插入图片描述

2.3.2、get(Object key) – 返回 key 对应的 value

根据对应的key值返回对应的value值

public static void main(String[] args) {
        Map<String,Integer> map = new HashMap<>();
        map.put("hello",2);
        map.put("bit",4);
        map.put("wwww",3);
        System.out.println(map.get("bit"));
    }

在这里插入图片描述

2.3.3、 getOrDefault(Object key, V defaultValue) 返回 key 对应的 value,key 不存在,返回默认值

public static void main(String[] args) {
        Map<String,Integer> map = new HashMap<>();
        map.put("hello",2);
        map.put("bit",4);
        map.put("wwww",3);
        System.out.println(map.getOrDefault("AAA",18));
    }

在这里插入图片描述

2.3.4、remove(Object key) 删除 key 对应的映射关系

public static void main(String[] args) {
        Map<String,Integer> map = new HashMap<>();
        map.put("hello",2);
        map.put("bit",4);
        map.put("wwww",3);
        System.out.println(map);
        map.remove("bit");
        System.out.println(map);
    }

在这里插入图片描述

2.3.5、Set<Map.Entry<K, V>> entrySet() 返回所有的 key-value 映射关系

在这里插入图片描述

2.3.6、Set keySet() - 返回所有 key 的不重复集合

在这里插入图片描述

至于为什么说 keySet方法 是返回不重复的集合。
是因为 Set 中 相同的数据只能存储一次。也就说Set里面存储的元素都是不同的。
这个在讲到Set的时候,你们就明白了。
而在 Map 中 存储 相同的元素,也有着自身的特点。
其 value 会根据最后一次的put的value值,进行更新。
在这里插入图片描述

2.3.7、boolean containsKey(Object key) - 判断是否包含 key

在这里插入图片描述

2.3.8、boolean containsValue(Object value) 判断是否包含 value

在这里插入图片描述

注意:
1、Map 是一个接口,不能直接实例化对象,如果实例化对象只能实例化其实现类 TreeMap 和 HashMap。

2、Map中存储“键值对” 的 Key 是唯一的,value 是可重复的。

3、在 TreeMap 中插入“键值对”时,key不能为null,否则就会抛出【NullPointerException异常】,但是Value可以为null。【HashMap 就没有这个问题】

4、Map 中的 Key 可以全部分离出来,存储到 Set中来进行访问(因为 Key 是不能重复)。

5、Map 中的 Value 可以全部分离出来,存储在 Collection 的 任何一个子集合中(value可能有重复)。

6、Map 中 “键值对” 的 Key 不能直接修改**,value可以修改,如果要修改 Key,只能先将Key删除掉,然后再来进行重新插入。

7、TreeMap 和 HashMap 的区别
在这里插入图片描述

三、Set 的说明

Set官方文档

Set与Map主要的不同有两点:Set是继承自Collection的接口类,Set中只存储了Key。
而 Map 是一个单独的接口,Map 中 存储 Key - Value
另外,Set 又称集合【Set 的汉语意思就是 集合】,它具有去重的功能,相同的元素,它只存储一个。

3.1、常见方法说明

在这里插入图片描述

3.1.1、boolean add(E e) 添加元素,但重复元素不会被添加成功

在这里插入图片描述

3.1.2、void clear() 清空集合

在这里插入图片描述

3.1.3、boolean contains(Object o) - 判断 o 是否在集合中

在这里插入图片描述

3.1.4、Iterator iterator() 返回迭代器

可参考 java -数据结构,List相关基础知识
在这里插入图片描述

3.1.5、boolean remove(Object o) 删除集合中的 o

在这里插入图片描述

3.1.6、int size() 返回set中元素的个数

在这里插入图片描述

3.1.7、boolean isEmpty() 检测set是否为空,空返回true,否则返回false

在这里插入图片描述

3.1.8、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的区别
    在这里插入图片描述

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

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

相关文章

Mysql多数据库之间表简单同步

方案&#xff1a;触发器优点&#xff1a; 工作效率和开发效率上有很大的提高缺点&#xff1a; 增加数据库服务器的开销在同一个mysql实例中&#xff1a;在数据库sakila中创建insert触发器use sakila; mysql> delimiter $$ mysql> create trigger insert_trigger after in…

奇安信天眼系统——探针/分析平台部署及联动

奇安信天眼系统——探针/分析平台部署及联动一 概述二 探针/分析平台部署及联动流量传感器&#xff08;探针&#xff09;分析平台一 概述 奇安信天眼主要包括威胁情报、分析平台、传感器和文件威胁鉴定器四个模块组成。 一般仅需分析平台&#xff0c;流量传感器&#xff08;探…

MySQL专题(学会就毕业)

MySQL专题0.准备sql设计一张员工信息表&#xff0c;要求如下&#xff1a;编号&#xff08;纯数字&#xff09;员工工号 (字符串类型&#xff0c;长度不超过10位)员工姓名&#xff08;字符串类型&#xff0c;长度不超过10位&#xff09;性别&#xff08;男/女&#xff0c;存储一…

研讨会回顾 | Perforce发布数字资产管理工具Helix DAM,帮助您按时按预算交付虚拟产品

2023年2月28日&#xff0c;龙智联合全球领先的数字资产管理和DevSecOps工具厂商Perforce共同举办Perforce on Tour网络研讨会——“赋能‘大’研发&#xff0c;助力‘快’交付”。 研讨会上&#xff0c;Perforce解决方案工程师Kory Luo分享了Perforce版本控制软件Helix Core的产…

Transformer:Attention is All You Need

【Transformer论文逐段精读【论文精读】】 https://www.bilibili.com/video/BV1pu411o7BE/?share_sourcecopy_web&vd_source30e93e9c70e5a43ae75d42916063bc3b论文地址&#xff1a;[1706.03762] Attention Is All You Need (arxiv.org)Transformer第一个完全依靠自我注意来…

0-1背包问题(二维数组压缩为一维数组)

0-1背包不懂的&#xff0c;可以看这篇 https://donglin.blog.csdn.net/article/details/129412502 一维dp数组 对于背包问题其实状态都是可以压缩的。 在使用二维数组的时候&#xff0c;递推公式&#xff1a;dp[i][j] max(dp[i - 1][j], dp[i - 1][j - weight[i]] value[i]…

leetcode 875. Koko Eating Bananas(koko吃香蕉)

piles数组里面是每堆香蕉里面有多少个香蕉&#xff0c; 现在有h小时可以吃香蕉&#xff0c;每小时只能吃一个堆&#xff0c; 定义每小时能吃k个香蕉&#xff0c;k > piles[i], 那么第 i 堆一次吃完&#xff0c;否则下一小时继续吃。 问k为多少时可以在h小时内把香蕉吃完。 …

Ubantu docker学习笔记(一) docker安装

文章目录一、安装准备工作二、安装docker三、问题四、docker镜像配置五、docker常见命令1.新建启动容器2.列出当前所有正在运行的容器3.退出容器4.启动已停止运行的容器5.重启容器6.停止容器7.强制停止容器 &#xff08;还在运行的&#xff09;8.删除已停止的容器重要的后台守护…

只做笔记有必要买apple pencil吗?苹果笔的代替笔推荐

如果仅仅使用IPAD来进行打游戏和看剧的话&#xff0c;未免有些浪费。ipad的作用还是挺大的&#xff0c;可以用来做学习笔记&#xff0c;也可以用来做绘画&#xff0c;也可以用来做一些重要的内容。很多人都会认为&#xff0c;苹果的电容笔很好用&#xff0c;但是价格上要比一般…

交流电机驱动器中的隔离电压感应

汽车和工业终端设备&#xff0c;如电机驱动器、串式逆变器和机载充电器&#xff0c;在高电压下运行&#xff0c;不能安全地与人直接互动。隔离电压测量通过保护人类免受高压电路执行一个功能的影响&#xff0c;有助于优化操作和确保使用的安全性。 设计用于高性能&#xff0c;隔…

Jquery项目中使用vue.js

大家在工作的情况中&#xff0c;可能会遇到之前的老项目采用jq书写&#xff0c;或者修改或者新增功能在jq中&#xff0c;原始jq的项目,代码可维护性很差,一个页面几千行jq,可维护性很差,工作量巨大&#xff0c;所以这个时候大家可以引入vue.js。 第一步&#xff1a;引入vue.js…

Proj-9.0.0源码编译(Windows)

源码下载&#xff1a;下载地址官网教程&#xff1a;官网教程使用osgeo4w在线安装&#xff0c;时间较长且到后面会报错&#xff0c;尝试多次无法安装成功&#xff0c;只能切换源代码编译安装&#xff0c;官网教程如下&#xff1a;&#xff08;补充一下对vcpkg的简单介绍&#xf…

音质好的运动蓝牙耳机有哪些、最好的运动蓝牙耳机推荐清单

而作为一名运动爱好者&#xff0c;我非常喜欢在运动时听音乐&#xff0c;简直不要太轻松&#xff01;不过在换了多款蓝牙耳机之后&#xff0c;我终于找到了几款非常适合运动的耳机&#xff0c;戴着它们运动&#xff0c;不仅不会出现不适感&#xff0c;还能享受清晰动听音乐&…

executor行为相关Spark sql参数源码分析

0、前言 参数名和默认值spark.default.parallelismDefault number of partitions in RDDsspark.executor.cores1 in YARN mode 一般默认值spark.files.maxPartitionBytes134217728(128M)spark.files.openCostInBytes4194304 (4 MiB)spark.hadoop.mapreduce.fileoutputcommitte…

snap使用interface:content的基础例子

snap做包还在学习阶段&#xff0c;官网文档可查看&#xff1a;The content interface | Snapcraft documentation该例子由publiser和consumer两部分组成&#xff0c;一个提供一个只读的数据区&#xff0c;一个来进行读取其中的信息&#xff0c;这样就完成了content的交互。publ…

华为机试题:HJ90 合法IP(python)

文章目录&#xff08;1&#xff09;题目描述&#xff08;2&#xff09;Python3实现&#xff08;3&#xff09;知识点详解1、input()&#xff1a;获取控制台&#xff08;任意形式&#xff09;的输入。输出均为字符串类型。1.1、input() 与 list(input()) 的区别、及其相互转换方…

ICASSP 2023论文模型开源|语音分离Mossformer

人类能在复杂的多人说话环境中轻易地分离干扰声音&#xff0c;选择性聆听感兴趣的主讲人说话。但这对机器却不容易&#xff0c;如何构建一个能够媲美人类听觉系统的自动化系统颇具挑战性。 本文将详细解读ICASSP2023本届会议收录的单通道语音分离模型Mossformer论文&#xff0…

EXCEL职业版本(3)

Excel职业版本&#xff08;3&#xff09; 公式与函数 运算符 算数运算符 关系运算符 地址的引用 相对引用&#xff1a;你变它就变&#xff0c;如影随形 A2&#xff1a;A5 绝对引用&#xff1a;以不变应万变 $A$2 混合引用&#xff1a;识时务者为俊杰&#xff0c;根据时…

tkinter实现悬浮文字

悬浮文字效果如下图&#xff1a;不可点击&#xff0c;不可选中&#xff0c;任务栏不显示图标&#xff0c;文字背景完全透明。 实现方法&#xff1a; root.wm_overrideredirect(True) wm_overrideredirect方法&#xff0c;在Windows平台下&#xff0c;这个函数的作用&#xff…

项目规模估算如何精准 4大注意事项

项目报价&#xff0c;需要首先进行项目规模估算&#xff0c;如何估算更精准&#xff0c;6大注意事项。 1、项目范围规划 在项目估算前&#xff0c;需要对项目范围进行规划&#xff0c;这包括所有活动以及开发可交付产品所需的流程。范围规划是前提&#xff0c;它明确定义了项目…