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)

整体程序:添加删除遍历判断



运行结果如下图

posted @ 2022-04-05 17:57  无关风月7707  阅读(64)  评论(0编辑  收藏  举报