当前位置: 首页 > news >正文

Map和Set总结

Map和Set

Map和Set是专门用来进行搜索的数据结构,适合动态查找

模型

搜索的数据称为关键字(key),关键字对应的叫值(value),key-value键值对

  1. key模型
  2. key-value模型

Map存储的就是key-value模型,Set只存储了key

Map

Map是接口类,key是唯一的不能重复

package Map;
import java.util.Map;
import java.util.TreeMap;/*** Created by Y_manyou927* Description:TreeMap实例* User: yyt* Date: 2023-03-10* Time: 14:57*/
public class TestMap {public static void main(String[] args) {Map<String,String> m = new TreeMap<>();// 1.使用put函数添加元素,无序的m.put("孙悟空","齐天大圣");m.put("猪八戒","天蓬元帅");m.put("沙和尚","卷帘大将");System.out.println(m.size());System.out.println(m);
//        m.put("唐僧","金蝉子");String str = m.put("唐僧","金蝉子");// 2.如果key存在,可以使用value替换原来的value,key的值不能换,除非删除keym.put("唐僧","师傅");System.out.println(m);// get(key)返回value// 3.如果key存在,返回value,如果不存在,返回nullSystem.out.println(m.get("孙悟空"));System.out.println(m.get("白龙马"));System.out.println("======getOrDefault======");// 4.getOrDefault返回value,如果key不存在,返回一个默认值System.out.println(m.getOrDefault("孙悟空","齐天大圣"));System.out.println(m.getOrDefault("筋斗云","十万八千里"));System.out.println("======containsKey与containsValue======");// 5.containsKey(key)检查key是否包含,时间复杂度O(logN)// 使用红黑树的性质进行查找,存在true,否则falseSystem.out.println(m.containsKey("孙悟空")); //trueSystem.out.println(m.containsKey("二郎神")); //false// containsValue(value)检查value是否包含,时间复杂度0(N)// 6.进行整体遍历,存在true,否则falseSystem.out.println(m.containsValue("齐天大圣")); //trueSystem.out.println(m.containsValue("斗战胜佛")); //falseSystem.out.println("============");// 7.遍历key值与value值for (String s: m.keySet()) {System.out.print(s + " ");}System.out.println();for (String s: m.values()) {System.out.print(s + " ");}System.out.println();System.out.println("=============");// 8.打印所有的键值对// entrySet(): 将Map中的键值对放在Set中返回for (Map.Entry<String,String> entry : m.entrySet()) {System.out.println(entry.getKey()+"--->"+entry.getValue());}}
}

image.png
注意

  1. Map是一个接口,不能直接实例化对象,只能实例化其实现类TreeMap和HashMap

  2. Map中存放键值对的Key是唯一的,Value可以重复

  3. Map插入的键值对Key不能为空,否则会抛出 NullPointerException 异常,Value可以为空

  4. Map中的Key可以全部提取出来,存储到Set中进行访问(Key不能重复

  5. Map中的Value可以全部提取出来,存储到Collection中的任何一个子集合中

  6. Map中键值对的Key不能直接修改,Value可以修改,修改Key只能删除Key,然后重新插入

  7. TreeMap与HashMap区别

image.png

Set

Set与Map的区别:Set是继承Collection的接口类,Set只存储key

package Set;import java.util.Set;
import java.util.TreeSet;/*** Created by Y_manyou927* Description:TreeSet实例* User: yyt* Date: 2023-03-10* Time: 15:37*/
public class TestSet {public static void main(String[] args) {Set<String> s = new TreeSet<>();// 1.add(key) 不存在插入,存在不插入// 返回true 与 falses.add("孙悟空");s.add("猪八戒");s.add("沙和尚");System.out.println(s);boolean b = s.add("孙悟空");System.out.println(b); //falseSystem.out.println("============");// 2.contains(key)判断key是否存在System.out.println(s.contains("孙悟空")); //trueSystem.out.println(s.contains("唐僧")); //false// 3.remove移除存在的元素s.remove("孙悟空");System.out.println(s);System.out.println(s.size());}
}

image.png

注意

  1. Set是继承自Collection的接口类
  2. Set只存储到key,并且key要唯一
  3. Set底层是使用Map来实现的,其使用key与Object的一个默认对象作为键值对插入到Map中的
  4. Set最大功能就是对集合的元素进行去重
  5. LinedHashSet是在HashSet的基础上维护了一个双向链表来记录元素的插入次序
  6. Set的key不能修改,要修改必须先删除然后重新插入
  7. TreeSet与HashSet区别

image.png

哈希表

哈希表,散列表:通过哈希函数使元素的存储位置与它的关键码建立一一映射的关系

  1. 插入元素:根据元素的关键码,计算元素的存储位置并进行存放
  2. 搜索元素:对元素的关键码进行同样的计算,所得函数值作为元素的存储位置

哈希方法(散列方法):使用的转换函数称为哈希函数,构造出来的结构称为哈希表(HashTable)

哈希函数设置为:hash(key) = key % capacity ,capacity为存储元素底层空间大小

9c091be67841ffe9a3a527c5fee12c3.jpg

哈希冲突

哈希冲突:不同关键字通过哈希函数计算出相同的哈希地址

冲突-避免

关键字数量要大于哈希表底层数组的容量,因此哈希冲突是必然会发生的。我们只能降低哈希冲突的发生,或者解决哈希冲突发生产生的问题

1.哈希函数设计

哈希冲突发生的一个原因就可能是哈希函数设计的不合理

  1. 哈希函数的定义域必须包括需要存储的全部关键码,而如果散列表允许有m个地址时,其值域必须在0到m-1 之间
  2. 哈希函数计算出来的地址能均匀分布在整个空间中
  3. 哈希函数应该比较简单
2.常见哈希函数
  1. 直接定制法–(常用) 取关键字的某个线性函数为散列地址:Hash(Key)= A*Key + B 优点:简单、均匀 缺点:需要事先知道关 键字的分布情况 使用场景:适合查找比较小且连续的情况
  2. 除留余数法–(常用) 设散列表中允许的地址数为m,取一个不大于m,但最接近或者等于m的质数p作为除数,按照哈希函数: Hash(key) = key% p(p<=m),将关键码转换成哈希地址
3.冲突-避免-负载因子调节(重点掌握)

负载因子 : A = 表中的元素个数 / 散列表长度

image.png

当冲突率达到无法忍受的程度,可以通过降低负载因子来变相降低冲突率。已知哈希表的关键字个数是不可改变的,因此我们只能通过修改数组的长度来达到降低负载因子。

4.哈希冲突-解决

闭散列:开放地址法,当发生哈希冲突的时候,将key存放到冲突的下一个位置

1.线性探测

从发生冲突的位置开始,依次往后进行探测,直到寻找到下一个空位置为止

不能直接删除元素

2.二次探测

线性探测的缺陷就是产生冲突的数据全部堆积在一起,当然这与其找下一个空位置有关

二次探测就是为了避免这种问题

  • 闭散列最大的问题就是空间利用率比较低,这也是哈希的缺陷
哈希冲突-解决-开散列/哈希桶

开散列法又称为链地址法,将大集合中的搜索问题转化到小集合中进行搜索

JDK1.8开始使用尾插法

当数组的长度超过64且链表的长度超过8,此时链表会变成红黑树

81c68daab31bb6c350523a5e5fe8fcb.jpg

冲突严重时的解决办法
  1. 每个桶背后是另一个哈希表
  2. 每个桶背后是一颗搜索树

相关文章:

Map和Set总结

Map和Set Map和Set是专门用来进行搜索的数据结构&#xff0c;适合动态查找 模型 搜索的数据称为关键字(key)&#xff0c;关键字对应的叫值(value)&#xff0c;key-value键值对 key模型key-value模型 Map存储的就是key-value模型&#xff0c;Set只存储了key Map Map是接口类…...

pytorch网络模型构建中的注意点

记录使用pytorch构建网络模型过程遇到的点 1. 网络模型构建中的问题 1.1 输入变量是Tensor张量 各个模块和网络模型的输入&#xff0c; 一定要是tensor 张量&#xff1b; 可以用一个列表存放多个张量。 如果是张量维度不够&#xff0c;需要升维度&#xff0c; 可以先使用 …...

面试时候这样介绍redis,redis经典面试题

为什么要用redis做缓存 使用Redis缓存有以下几个优点&#xff1a; 1. 提高系统性能&#xff1a;缓存可以将数据存储在内存中&#xff0c;加快数据的访问速度&#xff0c;减少对数据库的读写次数&#xff0c;从而提高系统的性能。 2. 减轻后端压力&#xff1a;使用缓存可以减…...

机械学习 - scikit-learn - 数据预处理 - 2

目录关于 scikit-learn 实现规范化的方法详解一、fit_transform 方法1. 最大最小归一化手动化与自动化代码对比演示 1&#xff1a;2. 均值归一化手动化代码演示&#xff1a;3. 小数定标归一化手动化代码演示&#xff1a;4. 零-均值标准化(均值移除)手动与自动化代码演示&#x…...

华为OD机试题 - 最长连续交替方波信号(JavaScript)| 机考必刷

更多题库,搜索引擎搜 梦想橡皮擦华为OD 👑👑👑 更多华为OD题库,搜 梦想橡皮擦 华为OD 👑👑👑 更多华为机考题库,搜 梦想橡皮擦华为OD 👑👑👑 华为OD机试题 最近更新的博客使用说明本篇题解:最长连续交替方波信号题目输入输出示例一输入输出Code解题思路版…...

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…...

双通道5.2GSPS(或单通道10.4GSPS)射频采样FMC+模块

概述 FMC140是一款具有缓冲模拟输入的低功耗、12位、双通道&#xff08;5.2GSPS/通道&#xff09;、单通道10.4GSPS、射频采样ADC模块&#xff0c;该板卡为FMC标准&#xff0c;符合VITA57.1规范&#xff0c;该模块可以作为一个理想的IO单元耦合至FPGA前端&#xff0c;8通道的JE…...

理解java反射

是什么Java反射是Java编程语言的一个功能&#xff0c;它允许程序在运行时&#xff08;而不是编译时&#xff09;检查、访问和修改类、对象和方法的属性和行为。使用反射创建对象相比直接创建对象有什么优点使用反射创建对象相比直接创建对象的主要优点是灵活性和可扩展性。当我…...

EasyRcovery16免费的电脑照片数据恢复软件

电脑作为一种重要的数据储存设备&#xff0c;其中保存着大量的文档&#xff0c;邮件&#xff0c;视频&#xff0c;音频和照片。那么&#xff0c;如果电脑照片被删除了怎么办&#xff1f;今天小编给大家介绍&#xff0c;误删除的照片从哪里可以找回来&#xff0c;误删除的照片如…...

若依微服务版在定时任务里面跨模块调用服务

第一步 在被调用的模块中添加代理 RemoteTaskFallbackFactory.java: package com.ruoyi.rpa.api.factory;import com.ruoyi.common.core.domain.R; import com.ruoyi.rpa.api.RemoteTaskService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springf…...

SpringMVC简单配置

1、pom.xml配置 <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.1.12.RELEASE</version></dependency></dependencies><build><…...

xcat快速入门工作流程指南

目录一、快速入门指南一、先决条件二、准备管理节点xcatmn.mydomain.com三、第1阶段&#xff1a;添加你的第一个节点并且用带外BMC接口控制它四、第 2 阶段 预配节点并使用并行 shell 对其进行管理二&#xff1a;工作流程指南1. 查找 xCAT 管理节点的服务器2. 在所选服务器上安…...

C++回顾(十九)—— 容器string

19.1 string概述 1、string是STL的字符串类型&#xff0c;通常用来表示字符串。而在使用string之前&#xff0c;字符串通常是 用char * 表示的。string 与char * 都可以用来表示字符串&#xff0c;那么二者有什么区别呢。 2、string和 char * 的比较 &#xff08;1&#xff09…...

Hadoop入门

数据分析与企业数据分析方向 数据是什么 数据是指对可观事件进行记录并可以鉴别的符号&#xff0c;是对客观事物的性质、状态以及相互关系等进行记载的物理符号或这些物理符号的组合&#xff0c;它是可以识别的、抽象的符号。 他不仅指狭义上的数字&#xff0c;还可以是具有一…...

高校如何通过校企合作/实验室建设来提高大数据人工智能学生就业质量

高校人才培养应该如何结合市场需求进行相关专业设置和就业引导&#xff0c;一直是高校就业工作的讨论热点。亘古不变的原则是&#xff0c;高校设置不能脱离市场需求太远&#xff0c;最佳的结合方式是&#xff0c;高校具有前瞻性&#xff0c;能领先市场一步&#xff0c;培养未来…...

提升学习 Prompt 总结

NLP现有的四个阶段&#xff1a; 完全有监督机器学习完全有监督深度学习预训练&#xff1a;预训练 -> 微调 -> 预测提示学习&#xff1a;预训练 -> 提示 -> 预测 阶段1&#xff0c;word的本质是特征&#xff0c;即特征的选取、衍生、侧重上的针对性工程。 阶段2&…...

JavaScript学习笔记(2.0)

BOM--&#xff08;browser object model&#xff09; 获取浏览器窗口尺寸 获取可视窗口高度&#xff1a;window.innerWidth 获取可视窗口高度:window.innerHeight 浏览器弹出层 提示框&#xff1a;window.alert(提示信息) 询问框&#xff1a;window.confirm(提示信息) 输…...

直击2023云南移动生态合作伙伴大会,聚焦云南移动的“价值裂变”

作者 | 曾响铃 文 | 响铃说 2023年3月2日下午&#xff0c;云南移动生态合作伙伴大会在昆明召开。云南移动党委书记&#xff0c;总经理葛松海在大会上提到“2023年&#xff0c;云南移动将重点在‘做大平台及生态级新产品&#xff0c;做优渠道转型新动能&#xff0c;做强合作新…...

STM32F1开发实例-振动传感器(机械)

振动(敲击)传感器 振动无处不在&#xff0c;有声音就有振动&#xff0c;哒哒的脚步是匆匆的过客&#xff0c;沙沙的夜雨是暗夜的忧伤。那你知道理科工程男是如何理解振动的吗&#xff1f;今天我们就来讲一讲本节的主角&#xff1a;最简单的机械式振动传感器。 下图即为振动传…...

2023最新ELK日志平台(elasticsearch+logstash+kibana)搭建

去年公司由于不断发展&#xff0c;内部自研系统越来越多&#xff0c;所以后来搭建了一个日志收集平台&#xff0c;并将日志收集功能以二方包形式引入自研系统&#xff0c;避免每个自研系统都要建立一套自己的日志模块&#xff0c;节约了开发时间&#xff0c;管理起来也更加容易…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

计算机基础知识解析:从应用到架构的全面拆解

目录 前言 1、 计算机的应用领域&#xff1a;无处不在的数字助手 2、 计算机的进化史&#xff1a;从算盘到量子计算 3、计算机的分类&#xff1a;不止 “台式机和笔记本” 4、计算机的组件&#xff1a;硬件与软件的协同 4.1 硬件&#xff1a;五大核心部件 4.2 软件&#…...

Caliper 配置文件解析:fisco-bcos.json

config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...

深入理解Optional:处理空指针异常

1. 使用Optional处理可能为空的集合 在Java开发中&#xff0c;集合判空是一个常见但容易出错的场景。传统方式虽然可行&#xff0c;但存在一些潜在问题&#xff1a; // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...

ui框架-文件列表展示

ui框架-文件列表展示 介绍 UI框架的文件列表展示组件&#xff0c;可以展示文件夹&#xff0c;支持列表展示和图标展示模式。组件提供了丰富的功能和可配置选项&#xff0c;适用于文件管理、文件上传等场景。 功能特性 支持列表模式和网格模式的切换展示支持文件和文件夹的层…...