Java中的Set集合不允许存储重复元素的原理详解

 更新时间:2023年09月18日 10:25:19   作者:秃头不秃头农  
这篇文章主要介绍了Java中的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方法,保证元素不重复。

到此这篇关于Java中的Set集合不允许存储重复元素的原理详解的文章就介绍到这了,更多相关Set集合底层原理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 关于Java中XML Namespace 命名空间问题

    关于Java中XML Namespace 命名空间问题

    这篇文章主要介绍了Java中XML Namespace 命名空间,XML命名空间是由国际化资源标识符 (IRI) 标识的 XML 元素和属性集合,该集合通常称作 XML“词汇”,对XML Namespace 命名空间相关知识感兴趣的朋友一起看看吧
    2021-08-08
  • 工作中禁止使用Executors快捷创建线程池原理详解

    工作中禁止使用Executors快捷创建线程池原理详解

    这篇文章主要为大家介绍了工作中禁止使用Executors快捷创建线程池原理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • 猜你不知道Spring Boot的几种部署方式(小结)

    猜你不知道Spring Boot的几种部署方式(小结)

    这篇文章主要介绍了猜你不知道Spring Boot的几种部署方式(小结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • mybatis中嵌套使用foreach需要注意的坑

    mybatis中嵌套使用foreach需要注意的坑

    在使用MyBatis进行数据库操作时,如果需要在一个大的foreach标签中嵌套另一个foreach,需要注意内层foreach的item属性不能与外层重复,如果出现重复,会导致绑定参数时找不到正确的参数,从而抛出异常
    2024-09-09
  • 利用Mybatis自定义排序规则实现复杂排序

    利用Mybatis自定义排序规则实现复杂排序

    本文主要介绍了利用Mybatis自定义排序规则实现复杂排序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-09-09
  • Java实现的简单掷骰子游戏示例

    Java实现的简单掷骰子游戏示例

    这篇文章主要介绍了Java实现的简单掷骰子游戏,涉及Java随机数的简单生成、运算与判定相关操作技巧,需要的朋友可以参考下
    2018-01-01
  • 使用Maven打包时排除指定的目录或指定的类

    使用Maven打包时排除指定的目录或指定的类

    在maven项目中,通过修改pom.xml文件,在maven-compiler-plugin的configuration>excludes节点下添加排除匹配条件,可以剔除掉生产包中的测试类,注意使用**表示多级目录匹配,*表示一级目录匹配
    2024-11-11
  • 鸿蒙中的设备权限管理与申请详细示例代码

    鸿蒙中的设备权限管理与申请详细示例代码

    在移动应用开发中,权限管理是至关重要的一部分,尤其是在涉及用户隐私或系统资源(如相机、位置、存储等)的应用中,这篇文章主要介绍了鸿蒙中的设备权限管理与申请的相关资料,需要的朋友可以参考下
    2025-08-08
  • SpringBoot实现接口限流的常用方案

    SpringBoot实现接口限流的常用方案

    本文主要介绍SpringBoot项目的接口限流方案,市面上常用有2种限流方案漏桶和令牌桶,大家常用的都是令牌桶,本文也只实现了令牌桶的方案,需要的朋友可以参考下
    2025-08-08
  • 基于mybatis plus实现数据源动态添加、删除、切换,自定义数据源的示例代码

    基于mybatis plus实现数据源动态添加、删除、切换,自定义数据源的示例代码

    这篇文章主要介绍了基于mybatis plus实现数据源动态添加、删除、切换,自定义数据源,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03

最新评论