「数据结构」MapSet

🎇个人主页:Ice_Sugar_7
🎇所属专栏:Java数据结构
🎇欢迎点赞收藏加关注哦!

Map&Set

  • 🍉概念
  • 🍉模型
  • 🍉Map
    • 🍌TreeMap和HashMap的区别
    • 🍌Map常用方法
    • 🍌entrySet和keySet方法
  • 🍉Set
    • 🍌Set常用方法
    • 🍌TreeSet和HashSet的区别

🍉概念

Map和Set是专门用来进行搜索的容器或者数据结构,它们适合动态查找(即在查找时可能会进行一些插入和删除的操作)

🍉模型

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

  1. 纯 Key 模型,比如:
    有一个英文词典,快速查找一个单词是否在词典中
    快速查找某个名字在不在通讯录中

  2. Key-Value 模型,比如:
    统计文件中每个单词出现的次数,统计结果是每个单词都有与其对应的次数:<单词,单词出现的次数>

Map中存储的是Key-Value的键值对,Set中只存储了Key

🍉Map

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

在这里插入图片描述
注意:

  • Map是一个接口,不能直接实例化对象,如果要实例化对象,只能实例化其实现类TreeMapHashMap
  • Map中键值对的Key不能直接修改,value可以修改,如果要修改key,只能先将该key删除掉
  • Map中存放键值对的key是唯一的,而value是可以重复的。如果向Map中添加一个已经存在的键,那么新的value会覆盖原有的value
  • 在TreeMap中插入键值对时,key不能为空,否则会抛NullPointerException异常,value可以为空。但是HashMap的key和value都可以为空

🍌TreeMap和HashMap的区别

区别TreeMapHashMap
底层结构红黑树哈希桶
元素顺序元素按Key的自然顺序或自定义的比较器进行排序无序,因为哈希表的存储和遍历是无序的
查找、插入和删除操作的时间复杂度O(log n)O(1)
比较和重写key必须能够比较自定义类型需要重写equals和hashCode方法
应用场景需要Key有序的场景下不关心Key是否有序,需要更高的时间性能

🍌Map常用方法

方法功能
V get(Object key)返回 key 对应的 value
V getOrDefault(Object key, V defaultValue)返回 key 对应的 value,key 不存在,返回默认值
V put(K key, V value)设置 key 对应的 value
V remove(Object key)删除 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

🍌entrySet和keySet方法

上面的entrySet()方法返回Set<Map.Entry<K, V>>。其中的Map.Entry<K,V>是Map内部的一个接口,表示Map中的键值映射关系,可以将它类比为链表中的节点
这个接口主要提供了<Key, Value>的获取,value的设置以及key的比较方式

方法功能
K getKey()返回Entry中的key
V getValue()返回Entry中的value
V setValue(V value)将键值对中的value替换为指定value

要获取Map的key和value,我们需要借助entrySet方法,来道题演示一下:
只出现一次的数字II

思路:使用哈希表统计数组中每个元素的出现次数,Key为元素的值,Value为出现次数

class Solution {public int singleNumber(int[] nums) {Map<Integer,Integer> map = new HashMap<>();for(int num : nums) {map.put(num, map.getOrDefault(num,0)+1);}for(Map.Entry<Integer,Integer> entry: map.entrySet()) {if(entry.getValue() == 1) {return entry.getKey();}}return -1;}
}

keySet方法也可以拿到Map中的key,再通过get方法就可以拿到对应的value:

Map<String, Integer> map = new HashMap<>();
// 添加键值对
map.put("A", 1);
map.put("B", 2);
map.put("C", 3);// 遍历key集合
for (String key : map.keySet()) {Integer value = map.get(key); // 通过key获取valueSystem.out.println("Key: " + key + ", Value: " + value);
}

🍉Set

在这里插入图片描述

Set与Map主要有两点不同:

  1. Set是继承自Collection的接口类
  2. Set中只存储了Key

🍌Set常用方法

方法功能
boolean add(E e)添加元素,如果Set中已经有这个元素,则不会被添加
void clear()清空集合
boolean contains(Object o)判断 o 是否在集合中
Iterator< E > iterator()返回迭代器
boolean remove(Object o)删除集合中的 o
int size()返回set中元素的个数
boolean isEmpty()检测set是否为空,若为空则返回true,否则返回false
Object[] toArray()将set中的元素转换为数组返回
boolean containsAll(Collection<?> c)检查set中是否包含集合c中全部元素,如果是,则返回true,否则返回false
boolean addAll(Collection<? extends E> c)将集合c中的元素添加到set中,可以达到去重的效果

我们主要讲一下toArray方法

  • 这个方法返回一个包含Set中所有元素的数组,所以,当我们需要遍历Set中的元素或对Set进行数组操作时,可以用toArray方法将Set转换为数组
  • 如果一个方法的参数类型是数组,那么可以使用toArray方法将Set的元素转为数组,然后作为参数传递给方法

如果希望将元素转换为特定类型的数组,可以使用另一个重载的toArray方法:

<T> T[] toArray(T[] a);
  • 这个方法允许我们指定要转换的数组类型,并将Set中的元素存储在指定类型的数组中。
    如果指定的数组大小足够大,那它将用来存储Set中的元素。而如果大小不足以存储所有元素,那么toArray方法就会创建一个新的数组,并返回它

来看下例子:

    public static void main(String[] args) {Set<String> colors = new HashSet<>();colors.add("red");colors.add("blue");colors.add("green");// 使用toArray方法将Set转换为数组Object[] colorsArray = colors.toArray();System.out.println("Set转换为数组:" + Arrays.toString(colorsArray));// 使用重载的toArray方法指定类型String[] colorsArray2 = colors.toArray(new String[colors.size()]);System.out.println("Set转换为指定类型的数组:" + Arrays.toString(colorsArray2));}

在这里插入图片描述

🍌TreeSet和HashSet的区别

Set底层结构TreeSetHashSet
底层结构红黑树哈希桶
插入/删除/查找的时间复杂度O(logN)O(1)
是否有序关于Key有序不一定有序
线程安全不安全不安全
插入/删除/查找区别按照红黑树的特性来进行插入和删除先计算key哈希地址,然后进行插入和删除
比较与覆写key必须能够比较,否则会抛出ClassCastException异常自定义类型需要覆写equals和hashCode方法
应用场景需要Key有序的场景不关心Key是否有序,需要更高的时间性能

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

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

相关文章

2048游戏C++板来啦!

个人主页&#xff1a;PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 大家好呀&#xff0c;我是PingdiGuo_guo&#xff0c;今天我们来学习如何用C编写一个2048小游戏。 文章目录 1.2048的规则 2.步骤实现 2.1: 初始化游戏界面 2.1.1知识点 2.1.2: 创建游戏界面 2.2: 随机…

Days 31 ElfBoard 自启脚本中打开看门狗

1.在开机自启脚本中打开看门狗 rootELF1:~# vi /etc/rc.local 2.在自启脚本中添加上之后&#xff0c;然后在咱们的QT界面中找到看门狗应用&#xff0c; 发现显示打开看门狗失败&#xff1a; 3.修改看门狗源码&#xff0c;设置了超时时间后&#xff0c;关闭/dev/dev/watchdog节…

【Tomcat】:One or more listeners failed to start.报错解决方案

报错信息:One or more listeners failed to start. Full details will be found in the appropriate container log file. 具体就是web.xml此配置报错: 服务器启动错误Tomcat:One or more listeners failed to start.报错解决方案 IDEA:在使用IDEA运行SSM项目的时候 , Tomcat运…

error MSB8008: 指定的平台工具集(v143)未安装或无效。请确保选择受支持的 PlatformToolset 值解决办法

右击解决方案&#xff0c;选择属性 将工具集为143的修改为其他&#xff0c;如图 重新编译即可运行

网络原理(3)--以太网协议,DNS

&#x1f495;"Echo"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;网络原理(3)–以太网协议,DNS 在网络原理(2)中介绍了网络层中的一个重要的协议–ip协议,网络层关注的通信时的起点和终点,而数据链路层更加"底层"一些,关注的是传输过程…

【Effective Objective - C 2.0】——读书笔记(四)

文章目录 二十三、通过委托与数据源协议进行对象间通信二十四、将类的实现代码分散到便于管理的数个分类之中二十五、总是为第三方的分类名称加前缀二十六、切勿在分类里面声明属性二十七、使用“class-continuation分类”隐藏实现细节二十八、通过协议提供匿名对象 二十三、通…

springboot187社区养老服务平台的设计与实现

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

MySQL 基础知识(六)之数据查询(一)

目录 1 基本查询 1.1 查询相关列 (select * / 列名) 1.2 别名 (as) 1.3 去重 (distinct) 1.4 对列中的数据进行运算 (、-、*、/) 2 条件查询 (where) 2.1 等值查询 () 2.2 非等值查询 (>、<、>、<、!、><) 2.3 逻辑判断 (and、or、not) 2.4 区间判…

源码推荐:hello-algo @ github

github https://github.com/krahets/hello-algo 本项目旨在创建一本开源、免费、对新手友好的数据结构与算法入门教程。全书采用动画图解&#xff0c;结构化地讲解数据结构与算法知识&#xff0c;内容清晰易懂&#xff0c;学习曲线平滑。算法源代码皆可一键运行&#xff0c;支…

上位机图像处理和嵌入式模块部署(借鉴与学习)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 对于很多学院派的同学来说&#xff0c;他们对市场的感觉一般是比较弱的。如果写一个软件的话&#xff0c;或者说开发一个项目的话&#xff0c;他们…

(一)【Jmeter】JDK及Jmeter的安装部署及简单配置

JDK的安装和环境变量配置 对于Linux、Mac和Windows系统&#xff0c;JDK的安装和环境变量配置方法略有不同。以下是针对这三种系统的详细步骤&#xff1a; 对于Linux系统&#xff1a; 下载适合Linux系统的JDK安装包&#xff0c;可以选择32位或64位的版本。 将JDK的安装包放置…

VueCLI核心知识3:全局事件总线、消息订阅与发布

这两种方式都可以实现任意两个组件之间的通信 1 全局事件总线 1.安装全局事件总线 import Vue from vue import App from ./App.vueVue.config.productionTip false/* 1.第一种写法 */ // const Demo Vue.extend({}) // const d new Demo()// Vue.prototype.x d // 把Dem…

RK3568平台开发系列讲解(实验篇)用户空间和内核空间数据交换

🚀返回专栏总目录 文章目录 一、用户空间和内核空间数据交换二、实验驱动代码三、应用测试代码沉淀、分享、成长,让自己和他人都能有所收获!😄 一、用户空间和内核空间数据交换 内核空间和用户空间的内存是不能互相访问的。但是很多应用程序都需要和内核进行数据的交换,…

【AI视野·今日NLP 自然语言处理论文速览 第七十八期】Wed, 17 Jan 2024

AI视野今日CS.NLP 自然语言处理论文速览 Wed, 17 Jan 2024 (showing first 100 of 163 entries) Totally 100 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Deductive Closure Training of Language Models for Coherence, Accur…

优化策略模式,提高账薄显示的灵活性和扩展性

接着上一篇文章&#xff0c;账薄显示出来之后&#xff0c;为了提高软件的可扩展性和灵活性&#xff0c;我们应用策略设计模式。这不仅仅是为了提高代码的维护性&#xff0c;而是因为明细分类账账薄显示的后面有金额分析这个功能&#xff0c;从数据库后台分析及结合Java语言特性…

2024幻兽帕鲁服务器创建教程_阿里PK腾讯超简单

幻兽帕鲁官方服务器不稳定&#xff1f;自己搭建幻兽帕鲁服务器&#xff0c;低延迟、稳定不卡&#xff0c;目前阿里云和腾讯云均推出幻兽帕鲁专用服务器&#xff0c;腾讯云直接提供幻兽帕鲁镜像系统&#xff0c;阿里云通过计算巢服务&#xff0c;均可以一键部署&#xff0c;鼠标…

vscode 提取扩展时出错。XHR failed

检查 vscode 设置中的代理服务器&#xff0c;位置如下图 清空 vocode 中的 Proxy&#xff0c;我黄线框的部分&#xff0c;内容清空。 检查电脑系统环境变量&#xff0c;是否设置了 http_proxy 和 https_proxy&#xff0c;如果有设置&#xff0c;则删除这两项&#xff0c;下载完…

《区块链公链数据分析简易速速上手小册》第4章:交易数据分析(2024 最新版)

文章目录 4.1 解析交易输入和输出4.1.1 基础知识4.1.2 重点案例&#xff1a;追踪比特币交易4.1.3 拓展案例 1&#xff1a;以太坊交易的输入输出解析拓展案例1&#xff1a;以太坊交易的输入输出解析步骤1: 连接到以太坊网络步骤2: 获取交易数据步骤3: 解析交易输入结论 4.1.4 拓…

Uipath 调用Python 脚本程序详解

Python 活动概述 UiPath.Python.Activities 是一个新的活动包&#xff0c;创建它是为了支持直接从工作流运行 Python 脚本和方法。 其包含以下活动&#xff1a; Python 作用域(Python Scope) - 为 Python 活动提供作用域的容器。 加载 Python 脚本(Load Python Script) - 将 P…

中国电子学会2023年12月份青少年软件编程Scratch图形化等级考试试卷四级真题(含答案)

2023-12 Scratch四级真题 分数&#xff1a;100 题数&#xff1a;24 分数&#xff1a;60min 一、单选题(共10题&#xff0c;共30分) 1.运行下列程序&#xff0c;输入“abcdef”&#xff0c;程序结束后&#xff0c;变量“字符串”是&#xff1f;&#xff08;B&#xff09;(3…