HashMap和HashSet的知识点总结

news2024/10/6 4:07:53

前言

在之前我们介绍过TreeMap和TreeSet:

TreeMap+TreeSet 知识点梳理总结_Crystal_bit的博客-CSDN博客

也知道Key-Value和Key模型,但是我们可能还对Hash不太了解,这里我们对Hash了解之后再对HashMap和HashSet的基本使用了解一下。


目录

1. 哈希表的概念

2. 哈希冲突是什么?如何避免?解决方式?

3. HashMap和HashSet是什么?它们的使用?


1. 哈希表的概念

    哈希表(实际上就是一个数组)是可以不用比较,一次就能搜索到待查找元素的一种存储结构。在哈希表中,通过哈希函数让元素存储位置与其关键码之间建立映射关系,那么我们就可以通过哈希函数+某个元素的关键码计算出元素存储位置,从而找到该元素。如图:


2. 哈希冲突是什么?如何避免?解决方式?

    哈希冲突就是不同的关键码通过同一个哈希函数映射出同一个存储位置,就比如某个商品搞特价活动的时候,两个甚至是多个人对同一商品进行争夺,这就会发生冲突。对此我们需要一个好的哈希函数去尽可能的避免哈希冲突,一个好的哈希函数应该能让计算出来的地址均匀分布在哈希表中且不能太复杂。常见的哈希函数有直接定址法,除留余数法等。

针对冲突我们有两种解决方式,一种是闭散列法(线性探测+平方探测),一种是开散列法

闭散列法:发生冲突时,如果哈希表还未满,就把待插入元素放到冲突位置的某个空位置去。但是这个空位置有两种确定方式,一种是线性探测,类似于有人占了我的座位,我就跑它旁边去坐着,如果它旁边也有人了,我就去旁边的下一个,总会找到一个空位置(哈希表未满)。如图:

但是大家可能会发现,线性探测会将发生冲突的元素堆在一起,所有为了解决这个问题,我们可以使用平方探测法——下一个空位置 = (发生冲突位置 + 或 -  i (第 i 次冲突)的平方) % 哈希表大小。如图:

注:使用线性探测法存放元素,不能直接删除某个元素,不然就会导致元素查找有误,明明待查找元素存在于哈希表中,但是由于映射位置的元素已经被删除,所以就会被判定待查找元素不存在所以只能采用标记法删除哈希表中元素。

在Java中负载因子(已有元素个数 / 哈希表长度)默认0.75,它越小冲突率越小。负载因子超过0.75则只能对哈希表进行扩容去降低负载因子大小。大家可以看出使用闭散列方法往哈希表中存放元素,会导致空间利用率较低,比如十个位置,如果负载因子为0.75,那么我们放8个元素的时候,哈希表就需要扩容了。所以我们可以使用另一种方法——开散列方法 去解决冲突问题。

开散列法(链地址法):由数组+链表+红黑树组成一个哈希桶,数组每个位置存储一个哈希表,该哈希表中存的是在该数组下标发生冲突的元素,如图:


3. HashMap和HashSet是什么?它们的使用?

    HashMap和HashSet是Java利用哈希表实现的Map和Set。

    ● HashMap的常用方法及使用示例

public class Test {
    public static void main(String[] args) {
        Map<String,Integer> map = new HashMap<>(); // 初始化一个空的HashMap
        map.put("test",1); // 添加键值对
        map.put("x",2);
        int test = map.get("test"); //获取指定键的对应值
        int x = map.get("x");
        System.out.println(test + " " + x);
        //获取指定键的对应值,如果map中没有指定键,则返回默认值-1
        System.out.println(map.getOrDefault("find", -1));
        System.out.println(map.isEmpty()); //判断map内容是否为空
        Set<Map.Entry<String,Integer>> keys = map.entrySet(); // 获取所有的键对值
        for (Map.Entry<String,Integer> item:keys) {
            System.out.println(item.getKey() + ":" + item.getValue());
        }
        map.remove("test"); //删除指定键值对
        System.out.println(map.get("test"));
        System.out.println(map.size()); //map中的键值对数量
        map.clear(); //清空map的所有内容
    }
}

       运行结果:

    ● HashSet的常用方法及使用示例

public class Test {
    public static void main(String[] args) {
        Set<String> hashSet = new HashSet<>(); // 初始化一个空的HashSet
        hashSet.add("abc"); //往集合中添加元素
        hashSet.add("dfe");
        hashSet.add("add");
        System.out.println(hashSet.contains("add")); //集合中是否包含指定元素
        System.out.println(hashSet.isEmpty()); //集合是否为空
        hashSet.remove("add"); //移除指定元素
        Iterator<String> iterator = hashSet.iterator(); //返回集合中元素的迭代器
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
        hashSet.clear(); //清空集合中所有内容
        System.out.println(hashSet.size()); //获取集合中元素个数
    }
}

       运行结果:

注:Java中使用哈希桶方式解决冲突,所以其底层是数组+链表+红黑树的结构。当链表长度>= 8 && 数组长度 >= 64此时哈希表就会变成红黑树。


分享完毕~    

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

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

相关文章

LabVIEW 图像处理功能

设置成像系统并采集图像后&#xff0c;您可以分析和处理图像&#xff0c;以提取有关被检测对象的有价值信息。 内容 图像分析图像处理斑点分析机器视觉 图像分析 影像分析结合了基于影像像素的灰度强度计算统计数据和测量的技术。您可以使用影像分析功能来确定影像质量是否足以…

scratch lenet(10): C语言计算log

scratch lenet(10): C语言计算log 文章目录 scratch lenet(10): C语言计算log1. 目的2. 原理: x m ∗ 2 p x m * 2^p xm∗2p3. 公式展开3.1 公式分解3.2 获取 m m m3.3 获取 p p p3.4 Remez 算法Remez 算法用于 sin(x) 的快速计算Remez 算法用于 exp 的近似Remez 用于自然…

【MySQL数据库】存储过程

目录 一、存储过程1.1概述1.2优点 二、存储过程实战2.1创建存储过程2.2存储过程的参数2.3条件语句 if-then-else end if2.4循环语句while end while 一、存储过程 1.1概述 存储过程是一组为了完成特定功能的SQL语句集合。存储过程在使用过程中是将常用或者复杂的工作预先使…

CSS基础学习--25 border(边框)进阶

一、边框常见属性 border-radiusbox-shadowborder-image 属性说明CSSborder-image设置所有边框图像的速记属性。3border-radius一个用于设置所有四个边框- *-半径属性的速记属性3box-shadow附加一个或多个下拉框的阴影3 二、border-radius 圆角 在 CSS2 中添加圆角棘手。我…

网络协议TCP/IP 协议学习笔记一

T C P / I P通常被认 为是一个四层协议系统&#xff0c;每一层负责不同的功能&#xff1a; 1) 链路层&#xff0c;有时也称作数据链路层或网络接口层&#xff0c; 通常包括操作系统中的设备驱动程序和计算机 中对应的网络接口卡。它们一起处理与电缆&#xff08;或其他任何传输…

CSS基础学习--26 渐变(Gradients)

CSS3 渐变&#xff08;gradients&#xff09;可以让你在两个或多个指定的颜色之间显示平稳的过渡。以前&#xff0c;你必须使用图像来实现这些效果。但是&#xff0c;通过使用 CSS3 渐变&#xff08;gradients&#xff09;&#xff0c;你可以减少下载的时间和宽带的使用。此外&…

Linux tracing之基于uprobe/kprobe的调试调优浅析

经过长期的发展, kprobes/uprobes 机制在事件(events)的基础上分别为内核态和用户态提供了追踪调试的功能, 这也构成了 tracepoint 机制的基础, 后期的很多工具, 比如 perf_events, ftrace 等都是在其基础上演化而来. 参考由 Brendan Gregg 提供的资料来看, kprobes/uprobes 在…

Minecraft我的世界服务器搭建之Linux系统,我的世界服务器推荐

Minecraft 是一个流行的沙箱独立游戏&#xff0c;由瑞典程序员 Markus “Notch” Perssion 首先创造&#xff0c;后来由 Mojang 开发并发布。这是一款关于打碎和放置砖块的游戏。首先&#xff0c;人们建造建筑物来抵抗夜晚的怪物&#xff0c;随着游戏的发展&#xff0c;玩家一起…

Spark Stream操作Kafka总结

kafka集群搭建 搭建参考 https://www.toutiao.com/article/6496743889053942286/?log_fromd5d6394cf75d_1687599146327 zk下载位置 国内&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/ 国外&#xff1a;Apache ZooKeeper kafka位置 国内&#xff…

Kubernetes(k8s)容器编排Pod介绍和使用

目录 1 Pod 特点1.1 网络1.2 存储 2 使用方式2.1 自主式Pod2.2 控制器管理的Pod 3 自主运行Pod3.1 创建资源清单3.1.1 参数描述 3.2 创建Pod3.3 Pod操作3.3.1 查看Pod列表3.3.2 查看描述信息3.3.3 访问pod3.3.4 删除Pod 4 控制器运行Pod4.1 创建资源清单4.2 参数描述4.2.1 Repl…

【IDEA】Directory创建多级目录的正确写法

在resource下创建包的时候&#xff0c;右键resourcenew的时候并没有Package,只有Directory 我们也可以用Directory创建包&#xff0c;但写法与在Package下创建包的写法会不一样 例如&#xff1a; 在directory创建包 我们在去看文件的时候 如果是用&#xff08; com.dao.m…

【数据结构】树以及堆的讲解

(这里写自定义目录标题) 提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、树的概念&#xff1f;二、树的表示方法三、树的实际应用四、二叉树概念以及结构1.概念2.特殊的二叉树3.二叉树的性质4.二叉树的存储…

指针与数组--动态数组(2)[1、长度可变的一维动态数组 2、长度可变的二维动态数组]

目录 一、长度可变的一维动态数组 二、长度可变的二维动态数组 由上篇文章的理论&#xff0c;接下来使用例题来阐述。 一、长度可变的一维动态数组 例题1、编程输入某班学生的某门课成绩&#xff0c;计算并输出平均值。学生人数由键盘输入。 #include <stdio.h> #i…

Apache服务器

文章目录 Apache服务器Linux安装ApacheApache文件结构Apache主配置文件案例 配置一台Web服务器 启动用户的个人网站虚拟主机的设定基于IP的虚拟主机基于域名的虚拟主机基于端口的虚拟主机 rewrite重写rewrite使用详解使用案例 域名跳转单个域名跳转多个域名跳转 status状态页ap…

“插入排序:小数据量排序的王者“

文章目录 &#x1f50d;什么是插入排序&#xff1f;&#x1f511;插入排序的优缺点&#x1f680;实现插入排序 &#x1f50d;什么是插入排序&#xff1f; 插入排序是一种简单的排序算法&#xff0c;它的基本思想是&#xff1a;将待排序的元素&#xff0c;从第二个元素开始&…

阿里架构师整理的Java经典面试题1220道(附答案)

学习如逆水行舟&#xff0c;尤其是 IT 行业有着日新月异的节奏&#xff0c;我们更要抓紧每一次可以学习和进步的机会。所以&#xff0c;没有撤退可言 即使是面试跳槽&#xff0c;那也是一个学习的过程。只有全面的复习&#xff0c;才能让我们更好的充实自己&#xff0c;武装自…

内网隧道代理技术(五)之 Netcat反弹Shell

Netcat反弹Shell Netcat简称NC,是一个简单、可靠的网络工具,被誉为网络界的瑞士军刀。通NC可以进行端口扫描、反弹Shell、端口监听和文件传输等操作,常用参数如下&#xff1a; 参数作用-c指定连接后要执行的shell命令-e指定连接后要执行的文件名-k配置 Socket一直存活(若不想…

一文了解远程桌面连接

一文了解远程桌面连接 一、引言1.1、远程桌面连接的概述1.2、远程桌面连接的应用场景 二、远程桌面连接的基本原理2.1、远程桌面连接的工作方式2.2、远程桌面连接的安全性 三、远程桌面连接的实现方法3.1、Windows自带的远程桌面连接3.2、第三方远程桌面连接工具 四、远程桌面连…

一阶低通滤波器(CODESYS FC和FB应用介绍)

一阶RC低通滤波器详细算法介绍请参看下面文章链接: PLC信号处理系列之一阶低通(RC)滤波器算法_plc计算滤波频率_RXXW_Dor的博客-CSDN博客1、先看看RC滤波的优缺点 优点:采用数字滤波算法来实现动态的RC滤波,则能很好的克服模拟滤波器的缺点; 1、在模拟常数要求较大的场合这…

数据挖掘——甘肃省县(区)域农业综合实力研究(论文)

《数据挖掘与分析》课程论文 题目&#xff1a;甘肃省县&#xff08;区&#xff09;域农业综合实力研究 xx学院xx专业xx班&#xff1a;xx 2023年6月 甘肃省县&#xff08;区&#xff09;域农业综合实力研究 xx (xx学院 xx学院) 摘要&#xff1a;本文主要研究甘肃省各县&#…