Map和Set总结

news2025/1/13 2:29:14

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的值不能换,除非删除key
        m.put("唐僧","师傅");
        System.out.println(m);
        // get(key)返回value
        // 3.如果key存在,返回value,如果不存在,返回null
        System.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,否则false
        System.out.println(m.containsKey("孙悟空")); //true
        System.out.println(m.containsKey("二郎神")); //false
        // containsValue(value)检查value是否包含,时间复杂度0(N)
        // 6.进行整体遍历,存在true,否则false
        System.out.println(m.containsValue("齐天大圣")); //true
        System.out.println(m.containsValue("斗战胜佛")); //false
        System.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 与 false
        s.add("孙悟空");
        s.add("猪八戒");
        s.add("沙和尚");
        System.out.println(s);
        boolean b = s.add("孙悟空");
        System.out.println(b); //false
        System.out.println("============");
        // 2.contains(key)判断key是否存在
        System.out.println(s.contains("孙悟空")); //true
        System.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. 每个桶背后是一颗搜索树

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

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

相关文章

ES增量同步方案

1 基于业务代码嵌入式的增量同步方式在Java业务代码要修改业务数据的地方&#xff0c;增加调用写入ES数据的方法优点&#xff1a;1、实现方式简单&#xff0c;可控粒度高&#xff1b;2、不依赖第三方数据同步框架&#xff1b;3、数据库不用做特殊配置和部署&#xff1b;缺点&am…

Qt学习_10_纯Ui操作_设置窗口、菜单栏、工具栏、按钮的图标

前言 Qt项目&#xff0c;如果功能少&#xff0c;项目小&#xff0c;用代码来配置图标的方式问题不大&#xff0c;无可厚非。但是一旦项目的功能复杂内容很多&#xff0c;用代码来配置图标的方式就显得很冗余&#xff0c;能在ui设计界面完成的工作&#xff0c;尽量就在ui设计界…

人工智能实验一:使用搜索算法实现罗马尼亚问题的求解

1.任务描述 本关任务&#xff1a; 了解有信息搜索策略的算法思想&#xff1b;能够运用计算机语言实现搜索算法&#xff1b;应用A*搜索算法解决罗马尼亚问题&#xff1b; 2.相关知识 A*搜索 算法介绍 A*算法常用于 二维地图路径规划&#xff0c;算法所采用的启发式搜索可以…

66 - 进程互斥锁的应用示例

---- 整理自狄泰软件唐佐林老师课程 查看所有文章链接&#xff1a;&#xff08;更新中&#xff09;深入浅出操作系统 - 目录 文章目录1. 简单生产消费者问题1.1 具体问题描述1.2 解决方案1.3 简单生产消费者问题模型1.4 编程实验&#xff1a;生产消费者示例2. 多任务读写问题&a…

中国人民大学与加拿大女王大学金融硕士,让这一年有一个骄傲的句号

在中国人民大学与加拿大女王大学金融硕士项目就读的同学&#xff0c;都有一个共同的目标&#xff0c;那就是在就读的这一年能画上一个圆满的句号。当拿到毕业证书的那一刻&#xff0c;所有的付出和努力都是值得的&#xff0c;在这里学习提升各自理论知识与金融服务经验&#xf…

学生信息表

目录 一、功能说明 二、核心思想 三、所用知识回顾 四、基本框架 五、js功能实现部分 一、功能说明 &#xff08;1&#xff09;输入对应的信息&#xff0c;点击录入可以为下面的表格添加一条记录&#xff0c;注意当所填信息不完整时不允许进行提交。 &#xff08;2&…

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

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

解决win10的过度保护导致文件下载不了程序不能打开运行

win7看来大概是要离我们远去了&#xff0c;虽然我们还能看见她的背影&#xff0c;但大势所趋&#xff0c;我们也只能慢慢的接受win10进入到我们的日常生活。但win10很多时候过度的保护却给我们带来了不便。这里列举两个最常见的问题&#xff0c;当然我这里也给出了解决方案。 文…

无线网络渗透测试系列学习(二) - 在VMware中搭建Metasploit靶机的详细步骤以及端口的简单了解

引言&#xff1a; 无线网络渗透测试系列学习目录&#xff1a; 无线网络渗透测试系列学习&#xff08;一&#xff09; - 在Windows系统下使用虚拟机安装Kali Linux操作系统 在上一篇文章中我们讲解了在Windows下如何在VMware虚拟机中安装Kali Linux操作系统和对Kali的简单配置…

vue项目部署到IIS

项目打包 vue 部署包&#xff1a; 项目路径运行npm run build 运行后生成一个dist文件夹&#xff0c;把这个文件夹放到要部署的服务器 IIS 配置 程序 需要用到下面这两个程序进行配置&#xff1a; 如果 IIS 没有 Web平台安装程序&#xff08;上图管理模块第二个&#x…

3月12日 植树节 Arbor Day / Planting Trees Day

"植树节“是一些国家为防止森林过度开伐&#xff0c;激发人们爱林、造林的感情而设立的法定节日。Arbor Day is one day in the year that prevents deforestation,celebrates trees and promotes planting.春天是植树的时间。Spring is the prime time for planting tree…

python3 简单爬虫入门 抓取男神图

主要目的 为 快速爬虫入门 参考&#xff1a;https://blog.csdn.net/c406495762/article/details/72597755 注意编写日期&#xff1a;2023-3-9 如果时间过久&#xff0c;则代码可能会失效&#xff0c;如果失效&#xff0c;可以根据下面的解析过程&#xff0c;手动更新代码。 …

云端Docker搭建ABY库以及本地CLion使用

文章目录ABY的搭建以及使用前言ABY库的下载、安装及测试CLion配置后续杂项项目改名使用其他的库最后ABY的搭建以及使用 前言 仅做记录&#xff0c;仅供参考&#xff0c;不同人有不同的使用方式命令手敲&#xff0c;可能有错&#xff0c;自己辨识勿问&#xff0c;我懂的也不多…

C++ Primer Plus 第6版 读书笔记(6) 第 6 章 分支语句和逻辑运算符

第 6 章 分支语句和逻辑运算符 C是在 C 语言基础上开发的一种集面向对象编程、泛型编程和过程化编程于一体的编程语言&#xff0c;是C语言的超集。本书是根据2003年的ISO/ANSI C标准编写的&#xff0c;通过大量短小精悍的程序详细而全面地阐述了 C的基本概念和技术&#xff0c;…

从 Clickhouse 到 Apache Doris,慧策电商 SaaS 高并发数据服务的改造实践

作者介绍&#xff1a; 马成&#xff0c;慧策 JAVA高级研发工程师慧策&#xff08;原旺店通&#xff09;是一家技术驱动型智能零售服务商&#xff0c;基于云计算 PaaS、SaaS 模式&#xff0c;以一体化智能零售解决方案&#xff0c;帮助零售企业数字化智能化升级&#xff0c;实现…

C++面向对象编程之六:重载操作符(<<,>>,+,+=,==,!=,=)

重载操作符C允许我们重新定义操作符&#xff08;例如&#xff1a;&#xff0c;-&#xff0c;*&#xff0c;/&#xff09;等&#xff0c;使其对于我们自定义的类类型对象&#xff0c;也能像内置数据类型&#xff08;例如&#xff1a;int&#xff0c;float&#xff0c;double&…

Java 最小路径和

最小路径和中等给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。说明&#xff1a;每次只能向下或者向右移动一步。示例 1&#xff1a;输入&#xff1a;grid [[1,3,1],[1,5,1],[4,2,1]]输出&…

求“二维随机变量的期望E(X)与方差D(X)”例题(一)

离散型 设随机变量(X,Y)的联合分布律为 X\Y0100.10.210.30.4 (1)求E(X) 先求x的边缘分布律&#xff0c;表格里x0的概率为0.10.2&#xff0c;于是我们可得 X01P0.30.7直接求E(X)即可&#xff0c;得到结果 (2)求E(XY) 直接x与y相乘就行。 记得别乘多了&#xff0c;别的算了又…

代码随想录算法训练营day55 | 动态规划 583. 两个字符串的删除操作 72. 编辑距离

day55583. 两个字符串的删除操作1.确定dp数组&#xff08;dp table&#xff09;以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例推导dp数组72. 编辑距离1. 确定dp数组&#xff08;dp table&#xff09;以及下标的含义2. 确定递推公式3. dp数组如何初始化4…

idea热部署

Dea 热部署方式汇总&#xff1a;一、开启自动编译修改file->settings->compiler->build project automatically二、开启允许在运行中修改文件按ctrlshifta&#xff0c;搜索Registry双击进去&#xff0c;点击面板搜索running&#xff0c;勾选下面的值&#xff1a;Eclip…