#最近在练习算法和结构,他们的重要性不言而喻。今天分享的是手撕HashSet。我们以面试官的角度出发#
一.面试官:请讲一下你对HashSet的理解,并告诉我为什么要使用哈希算法
小Z:先说一下它的官方定义吧 (先把这些给面试官罗列出来再逐个展开解释)
一.理解:
1. HashSet,是一个不允许有重复元素的集合。
2.它实现了Set接口,并继承了AbstractSet抽象类。
3. HashSet 基于 HashMap 来实现的,集合的底层实现是一个哈希表,它使用哈希算法来存储和管理集合中的元素。
4.HashSet集合中的元素没有顺序。
5.HashSet 允许有 null 值。
二.为什么使用哈希算法(好处)
1.性能:
HashSet
具有快速查找性能。由于哈希表的设计,平均情况下,查找元素所需的时间复杂度是 O(1)。但在最坏情况下,当哈希碰撞发生较多时,查找时间可能会增加到 O(n),其中 n 是元素的数量。这里大O表示法就不具体介绍了,简单来说就是因为他去重的特点,以及分区比较,所以查找起来特别快。(不理解?上图)
这是不使用hashSet的情况:如下图所示
如下是使用hashSet的情况,想象你拉了一个超长的行李箱去旅游,将行李分类,每个大类都有一个哈希码。例如换洗衣服的哈希码是2,当要新装1条裤子的时候,裤子的哈希码计算出也为2。 此时无需查找整个行李箱(HashSet),只需要打开哈希码为2的这个桶位查找,是否有相同的裤子,如果有相同就放弃添加,如果没有就添加。严谨的表达如下:当要插入一个元素时,HashSet 会首先计算该元素的哈希码,然后确定将元素放入哪个桶中。如果多个元素具有相同的哈希码,它们将放入同一个桶中,并形成一个链表。
好处:提高性能,每次添加的时候都不用比一遍,而是分区比较。
缺点:占空间,因为是散列的,以空间换取时间。举个例子就是行李箱有10个空位置,不一定都是满的,而每个大类并不是紧密相连的,是随机选取空位置的。
提示</