每日面试题打卡(容器篇)——Day8

博主个人博客网站:文客
这个系列会长期更新!
如果你想每天和我打卡面试题、交流技术,可以关注一下我的个人博客网站:文客,我会每天在这里更新技术文章和面试题,也会及时收到大家的评论与留言,欢迎各位大佬来交流!

说一下 HashSet 的实现原理?

HashSet是基于HashMap实现的,HashSet的实现是比较简单的,其中很多的方法都是调用HashMap的方法来实现的。那么HashSet是如何进行存储的呢?HashSet的值存在HashMap的key上,HashMap的value统一为PRESETN,这里的PRESENT是HashSet中的一个Object类型的静态常量。

HashSet如何检查重复?HashSet是如何保证数据不可重复的?

当我们添加一个元素时,会先计算元素的hashCode,然后与其它元素的hashCode进行比较,如果没有相同的,则直接加入,如果有相同的话,进一步用equals方法来判定,如果equals方法判定两个对象相同,那么新加入的元素会顶替掉原来的元素,如果两个对象不同,则重新散列。HashSet的底层数据结构是HashMap,它的add方法也是通过调用HashMap的put方法实现的,HashSet存储的对象就相当于HashMap的key,对应的HashMap的value可以看作是一个虚拟值(其实是一个空的Object)。在HashMap中,key是具有唯一性的,当有两个相同的key时,先加入的会顶替掉原来的,所以HashSet正是依靠HashMap的key的唯一性来保证数据的不可重复性。

hashCode()与equals()的相关规定

  1. 如果两个对象相等,则hashcode一定也是相同的
  2. 两个对象相等,对两个equals方法返回true
  3. 两个对象有相同的hashcode值,它们也不一定是相等的
  4. 综上,equals方法被覆盖过,则hashCode方法也必须被覆盖
  5. hashCode()的默认行为是对堆上的对象产生独特值(其实应该就是将地址转化为十进制返回,而且hashCode时native方法,无法查看实现)。如果没有重写hashCode(),则该class的两个对象无论如何都不会相等(即使这两个对象指向相同的数据)。

HashSet与HashMap的区别

其实和上面的差不多,万变不离其宗,只要搞清楚HashSet和HashMap的联系与底层实现,不同的问题只是切换不同的表达形式。

首先HashSet时Set接口的实现类,而HashMap是Map接口的实现类

HashSet从使用者的角度来看,它只存储对象,但是从底层来看,它是使用HashMap存储数据,存储的对象就是HashMap的key,HashMap的value是一个虚值(空的Object)。而HashMap是基于键值对的形式存储对象的。

上面说到HashSet的值其实是HashMap的key,所以HashSet是根据对象来计算hashCode。而HashMap是根据key计算hashCode

在网络上还会看到这样的说法:HashMap相对于HashSet效率更快。其实这么说并不准确,首先它们存储与访问的效率都是O(1),这是哈希表的特性,那么造成性能差异的只有计算hashCode这个环节。HashSet底层是HashMap,所以我们暂且把HashSet看作HashMap,有两个HashMap,它们都存储一个相同的Object对象,不同的是一个HashMap的key是Integer类型的整数1,另一个的key是长度为50的String串,那么肯定计算String串的hashCode的时间比Integer类型的整数1要长,所以它们的效率差异主要取决于key的复杂程度,并没有绝对的说法。

下期预告

下期会分析ArrayList的扩容机制,面试题继续前推。

ps:前些天在处理返校的事宜,所以没更新,今天课比较多(允许我水一水😭),明天肯定多更点!

博客原文地址

每日面试题打卡(容器篇)——Day8
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

九天漩女

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

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

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

打赏作者

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

抵扣说明:

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

余额充值