「数据结构」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.hqwc.cn/news/469842.html

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

相关文章

LeetCode.107. 二叉树的层序遍历 II

题目 107. 二叉树的层序遍历 II 分析 这个题目考查的是二叉树的层序遍历&#xff0c;对于二叉树的层序遍历&#xff0c;我们需要借助 队列 这种数据结构。再来回归本题 &#xff0c;我们只需要将 二叉树的层序遍历的结果逆序&#xff0c;就可以得到这道题我们要求的答案了。…

引用的账户当前已锁定,且可能无法登录怎么办

WINDOWS提示引用账户已锁定怎么办&#xff08;补充&#xff09; 一般是多次输错密码的原因&#xff01;等待半个小时就能打开了&#xff01; 这跟手机锁屏被小朋友锁死原理类似&#xff0c;但是Windows不会给你显示具体时间&#xff0c;所以你登录BIOS改系统时间&#xff0c;欺…

102. 二叉树的层序遍历

给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15,7]]示例 2&#xff1a; 输入&…

模型 人货场

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。重在提升认知。连接消费者与商品的桥梁。 1 ”人货场“模型的应用 1.1 以抖音直播电商为背景的人货场应用-小杨哥的带货奇迹 小杨哥&#xff0c;一位知名的抖音主播&#xff0c;以其幽默风趣的直播风…

从零开始学howtoheap:解题西湖论剑Storm_note

how2heap是由shellphish团队制作的堆利用教程&#xff0c;介绍了多种堆利用技术&#xff0c;后续系列实验我们就通过这个教程来学习。环境可参见从零开始配置pwn环境&#xff1a;从零开始配置pwn环境&#xff1a;从零开始配置pwn环境&#xff1a;优化pwn虚拟机配置支持libc等指…

AJAX——HTTP协议

1 HTTP协议-请求报文 HTTP协议&#xff1a;规定了浏览器发送及服务器返回内容的格式 请求报文&#xff1a;浏览器按照HTTP协议要求的格式&#xff0c;发送给服务器的内容 1.1 请求报文的格式 请求报文的组成部分有&#xff1a; 请求行&#xff1a;请求方法&#xff0c;URL…

算法-16-并查集

并查集简介 并查集&#xff1a;一开始&#xff0c;把a&#xff0c;b&#xff0c;c放入并查集&#xff0c;a自己一个集合&#xff0c;b自己一个&#xff0c;c自己一个 提供的方法 1.boolean isSameSet(a,b)&#xff0c;判断ab是否在同一个集合 2.void union(a,b),把a所…

【Midjourney】解密Midjourney付费订阅:畅享全新体验!(详细流程与各版本一览)

一、Midjourney 付费订阅流程 1、在首页点击Purchase plan 2、进入到midjourney年月选择页面 3、这里续费一个最便宜的版本 , 按年付费 8 , 按月 10 4、输入银行卡信息 , 用的WildCard虚拟信用卡 &#xff0c;打开 5、填写完银行卡信息就订阅成功 二、Midjourney 各版本介绍…

彻底改变单词嵌入和文本分类

目录 一、介绍二、起源与发展三、技术基础四、FastText 的优点五、代码六、结论 一、介绍 2016 年由 Facebook 的 AI Research &#xff08;FAIR&#xff09; 团队推出的 FastText 已迅速成为自然语言处理 &#xff08;NLP&#xff09; 领域的基石。这种创新的词嵌入和文本分类…

算法——数论——快速幂

目录 快速幂 费马小定理 一、试题 算法训练 A的B的C次方次方 快速幂 快速幂是一种用于快速计算幂运算的算法。计算复杂度 O(log n)基本思想是利用指数 n 的二进制展开形式&#xff0c;将 转化为多个 a 的幂的乘积&#xff0c;然后通过迭代快速计算。 快速幂的示例代码&…

计算机组成原理:存储系统【二】

&#x1f308;个人主页&#xff1a;godspeed_lucip &#x1f525; 系列专栏&#xff1a;计算机组成与原理基础 &#x1f6f0;️1 Cache概述&#x1f6e9;️1.1 局部性原理&#x1f6eb;1.1.1 空间局部性&#x1f6eb;1.1.2 时间局部性 &#x1f6e9;️1.2 性能指标&#x1f6eb…

06MARL经典算法 基于agent modelling

文章目录 前言agent modelling一、Fictitious Play(虚拟博弈)二、JAL with agent modelling 前言 基于JAL的算法需要对智能体的行为做出假设以便应用博弈知识求解策略&#xff0c;带来很多限制&#xff0c;根据其他智能体观察到的行为对其它智能体进行建模&#xff0c;预测其行…