为什么使用哈希算法?手撕HashSet:添加、删除、是否存在、扩容

本文从面试角度出发,详细讲解HashSet的原理和使用,包括HashSet为何使用哈希算法及其带来的性能优势,以及如何添加、检查元素存在、删除元素、计算大小和迭代。同时,通过代码示例展示了HashSet的常用操作,强调其非线程安全的特性。
摘要由CSDN通过智能技术生成

     #最近在练习算法和结构,他们的重要性不言而喻。今天分享的是手撕HashSet。我们以面试官的角度出发#

一.面试官:请讲一下你对HashSet的理解,并告诉我为什么要使用哈希算法

小Z:先说一下它的官方定义吧  (先把这些给面试官罗列出来再逐个展开解释)

一.理解:

         1. HashSet,是一个不允许有重复元素的集合

         2.它实现了Set接口,并继承了AbstractSet抽象类。

         3. HashSet 基于 HashMap 来实现的,集合的底层实现是一个哈希表,它使用哈希算法来存储和管理集合中的元素。          

         4.HashSet集合中的元素没有顺序。

         5.HashSet 允许有 null 值

         6.HashSet 不是线程安全的

二.为什么使用哈希算法(好处)

     1.性能HashSet 具有快速查找性能。由于哈希表的设计,平均情况下,查找元素所需的时间复杂度是 O(1)。但在最坏情况下,当哈希碰撞发生较多时,查找时间可能会增加到 O(n),其中 n 是元素的数量。这里大O表示法就不具体介绍了,简单来说就是因为他去重的特点,以及分区比较,所以查找起来特别快。(不理解?上图)

    这是不使用hashSet的情况:如下图所示

     如下是使用hashSet的情况,想象你拉了一个超长的行李箱去旅游,将行李分类,每个大类都有一个哈希码。例如换洗衣服的哈希码是2,当要新装1条裤子的时候,裤子的哈希码计算出也为2。       此时无需查找整个行李箱(HashSet),只需要打开哈希码为2的这个桶位查找,是否有相同的裤子,如果有相同就放弃添加,如果没有就添加。严谨的表达如下:当要插入一个元素时,HashSet 会首先计算该元素的哈希码,然后确定将元素放入哪个桶中。如果多个元素具有相同的哈希码,它们将放入同一个桶中,并形成一个链表。

        好处:提高性能,每次添加的时候都不用比一遍,而是分区比较。

        缺点:占空间,因为是散列的,以空间换取时间。举个例子就是行李箱有10个空位置,不一定都是满的,而每个大类并不是紧密相连的,是随机选取空位置的。

       提示</

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Warren-Z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值