Set集合不允许存储重复元素的原理

Set集合不允许存储重复元素的原理


前言

我们之前使用Set集合的时候发现,Set集合的特点是不允许存储重复元素,这是为什么呢,下面我们一起来研究一下。

实际操作

代码如下(示例):

//创建hashset集合对象
        HashSet<String> set = new HashSet<>();
        String s1=new String("abc");
        String s2=new String("abc");
        set.add(s1);
        set.add(s2);
        set.add("重地");
        set.add("通话");//两个特殊的字符串
        set.add("abc");
        System.out.println(set);

我们可以看到,我向set集合中存储了三次abc和两个特殊字符串,我们可以看到打印结果:
在这里插入图片描述
我们可以发现,集合中只有重地,通话,abc。为什么会出现这样的结果呢。

第一步:我们创建了一个hashset集合。

//创建hashset集合对象
        HashSet<String> set = new HashSet<>();

我们一定是在堆内存中开辟一块空间。上一篇文章中我们说到hashset的结构是:哈希表:数组+链表/红黑树。我们可以看到:
在这里插入图片描述
注意:set集合在调用add方法时,会调用元素的hashcode和equals方法,判断元素是否重复。
首先,我们向集合中存储的第一个元素是s1

        set.add(s1);

add方法回调用s1.hashCode()方法,计算字符串abc的哈希值(96354)。就会在集合中找有没有96354这个哈希值的元素。发现没有,就会将元素abc存储到集合中去。
在这里插入图片描述
当开始存储存储s2时,add方法回调用s2.hashCode()方法,计算字符串abc的哈希值(96354)。就会在集合中找有没有96354这个哈希值的元素。发现有,注意哈希值一样就会发生哈希冲突。s2会调用equals方法和哈希值相同的元素进行比较:s2.equals(s1),equals方法返回ture,认定两个元素相同,就不会把s2存储到集合中。

之后我们就要存储字符串重地:

        set.add("重地");

add方法回调用重地.hashCode()方法,计算字符串重地的哈希值(1179395)。就会在集合中找有没有1179395这个哈希值的元素。发现没有,就会将元素重地存储到集合中去。
在这里插入图片描述
接下来我们就该存储通话。add方法回调用通话.hashCode()方法,计算字符串通话的哈希值(1179395)。就会在集合中找有没有1179395这个哈希值的元素。发现有,就会调用equals方法进行比较:”通话“.equals(“重地”),返回false,认定两个元素不相同,所以会将元素存储在1179395同样的位置上。
在这里插入图片描述

这就是set元素存储元素不重复的元素的原理。但是这有一个前提,存储元素必须重写hashcode和eqluas方法,保证元素不重复。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值