HashSet
***HashSet
***两个问题
1.为什么说存入的元素不能重复:
原理:
在Object类里面有一个 native hashCode();方法可以返回对象的哈希值,要存储元素的时候调用add();方法,add方法会调用hashCode方法和equals方法判断元素是否重复。
例子如下:
在这个例子里面
Set集合在调用add方法的时候它会调用元素的HashCode()方法和equals()方法判断元素是否重复
add方法调用s1的hashCode方法计算字符串"abc"的哈希值 96354
在集合里面没有96354就把这个哈希值存入到数组中且把s1字符串挂到这个数组对应的索引下面
add调用s2的hashCode方法计算哈希值,发现数组存在了96354这个哈希值,就会发生哈希冲突,然后调用equals方法s2.equals(s1)
返回ture ,两个元素哈希值相同且认定两个元素相同,就不会把s2存储到集合中
可以同时存入重地和通话完全是因为 在第二步中重地.equals("通话")不相等返回了false 从而认定元素不相同
发现hash冲突才会调用equals方法
代码如下:
这里面要特别提醒:字符串里面 “重地”和“通话”的哈希值是一样的
2.哈希表=数组+红黑树(查询速度极快)又是怎么回事呢?
这是当如果表中同一哈希值下挂的元素超过8个就会转换成对应的红黑树(这样查询的速度就超级快)
***HashSet数据存储过程
下图为一个HashSet数组的结构和三个元素,演示存储的过程
首先存入字符串“abc”;通过hashCode方法发现数组里没有96354这个哈希值,将这个哈希值存入数组,然后将元素"abc"以链表的方式连接在对应的哈希值数组下
然后重复操作同样存入元素"重地";
最后,存入元素“通话”,在调用方法hashCode返回哈希值的时候,发现数组中已经存在117935这个哈希值,要调用equals方法比较元素“重地”和“通话”,若返回false,存入“通话”,若返回ture,放弃存储。很明显,“通话”.equals("重地")返回false,因为哈希值一样所以“通话”以链表的形式挂在“重地”下面,形成链表
HashSet使用(1)
整体程序:添加删除遍历判断
运行结果如下图
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律