HashSet详解

简介: HashSet详解

概述


HashSet也是一个使用频率非常高的一个集合容器,最大的特点是存储的元素是没有重复的,而且是无序的,那么对于HashSet是如何判断原始是否重复、底层又是怎么实现的,你了解吗?


HashSet介绍


HashSet 基于 HashMap 来实现的,是一个不允许有重复元素的集合。

  • 集合中的元素不重复
  • 允许有null值
  • 是无序的,即不会记录插入的顺序
  • 不是线程安全的, 如果多个线程尝试同时修改 HashSet,则最终结果是不确定的

1671183968627.jpg

以上是HashSet的类结构图:

  • 实现了Set接口,表名是一个去重集合容器
  • 直接继承了AbstractSet类,该类实现了Set的骨干操作
  • 实现了Cloneable接口,标记该类可以进行clone操作
  • 实现了Serializable接口,标记改类可以序列化


构造方法


  • public HashSet()

说明: 创建一个默认为空的HashSet

  • public HashSet(int initialCapacity, float loadFactor)

说明:创建一个HashSet容器,initialCapacity表示设置初始容量大小,loadFactor表示负载因子, 当容量达到最大容量*负载因子时,需要进行扩容,这属于HashMap的知识。

  • public HashSet(Collection<? extends E> c)

说明:创建一个容器内容为c的集合


关键方法


  • public boolean add(E e)

说明:向集合中添加元素

  • public boolean remove(Object o)

说明:向集合中删除元素

  • public void clear()

说明:清空集合元素

  • public int size()

说明:返回集合中元素的数量


使用案例


@Test
    public void test1() {
        Set<String> set = new HashSet<>();
        set.add("a");
        set.add("b");
        set.add("a");
        set.add("c");
        // 添加了4个元素,size = 3
        System.out.println(set.size());
        System.out.println(set);
    }

运行结果:

1671183986646.jpg

小结: 说明重复的元素不会被添加到集合中。


核心机制


实现原理


HashSet的实现原理是基于HashMap实现的,关键是要了解HashMap的实现原理,我们下文主要从源码说明HashSet的确是走的HashMap的逻辑。


如何判断元素是否是一致


HashSet最大的特点是集合中的元素不重复,那它是根据什么判断是否重复,或者是同一个元素呢?大致逻辑如下:

当你把对象加入到HashSet时,HashSet会先计算对象的hashcode值来判断对象加入的位置,同时也会与其他加入的对象的hashcode值作比较,如果没有相符的hashcode值,HashSet会假设对象没有重复出现,但是如果发现有相同hashcode值的对象,这时会调用equals()方法来来检查hashcode相等的对象是否真的相同,如果两者相同,HashSet就不会加入操作成功。


源码解析


主要看下add方法

// HashSet的add方法
public boolean add(E e) {
        // 调用map的put方法
        return map.put(e, PRESENT)==null;
}

定义了一个HashMap的属性,如下

1671184000497.jpg

所以说明HashSet的底层实现就是HashMap,只不过只关注map的key部分。


总结


HashSet是一个很有用的容器,最大的特点是集合中的元素都是不重复的,底层实现是基于HashMap,所以关键是要了解HashMap的实现机制。

目录
相关文章
|
安全 Shell Linux
【Shell 命令集合 磁盘管理 】Linux 磁盘分区工具 fdisk命令使用教程
【Shell 命令集合 磁盘管理 】Linux 磁盘分区工具 fdisk命令使用教程
613 0
|
存储 Java Serverless
HashMap的底层数据结构是怎样的
在Java中,HashMap是一种基于哈希表的Map接口实现,以其高效的数据存取能力而广泛使用。本文将深入探讨HashMap的底层数据结构,揭示其如何通过数组、链表和红黑树的结合来优化性能。
|
11月前
|
安全 Apache 数据库
【倒计时3天】NineData x Apache Doris x 阿里云联合举办数据库技术Meetup,5月24日深圳见!
5月24日,NineData联合Apache Doris与阿里云在深圳举办数据库技术Meetup。活动聚焦「数据实时分析」与「数据同步迁移」两大领域,邀请行业专家分享技术趋势、产品实践及解决方案,助力企业构建高效安全的数据管理体系。时间:14:00-17:30;地点:深圳新一代产业园2栋20楼会议室。线下名额有限(80人),速报名参与深度交流!
309 1
|
机器学习/深度学习 人工智能 安全
云工开物合作动态丨2025西安交通大学 -阿里云课程(第一批)上线
2025年春季学期,西安交通大学联合阿里云推出九门特色课程,涵盖工程、法律、生命科学、经济管理等领域。这些课程打破传统学科壁垒,提供AI实践工具、动手实验资源及专属算力支持,帮助学生在理论学习之余进行实际操作,提升能力。结课后还将颁发阿里云创作者证书,助力学生成长为跨领域复合型人才。无论专业背景如何,都能找到适合自己的AI进化路径。机会难得,不容错过!
|
自然语言处理 算法 搜索推荐
《当NLP邂逅GIS:跨界融合的无限可能》
自然语言处理(NLP)与地理信息系统(GIS)的融合正开启全新应用大门,带来智能地理信息检索、地理知识图谱构建、灾害预警优化及智能导航等创新。通过NLP理解复杂语义并转化为GIS指令,降低了用户门槛,提升了效率。然而,数据异构性、语义理解复杂性、计算资源瓶颈及复合型人才短缺等问题仍待解决。尽管面临挑战,未来NLP与GIS的深度融合将为各行业带来更多变革与发展机遇。
303 12
|
存储 Java C++
Java数组:静态初始化与动态初始化详解
本文介绍了Java中数组的定义、特点及初始化方式。
1146 12
|
分布式计算 大数据 分布式数据库
大数据-158 Apache Kylin 安装配置详解 集群模式启动(一)
大数据-158 Apache Kylin 安装配置详解 集群模式启动(一)
311 5
|
测试技术 芯片
飞针测试机在贴装线路板应用
【8月更文挑战第26天】飞针测试机在PCBA中的应用涵盖检测开路与短路、测试元件电气性能、检查元件安装正确性、识别缺失或损坏的元件,并适用于小批量和多品种生产,有助于提高产品质量和可靠性。它能提供详细故障信息,便于问题定位与反馈,但测试速度较慢,需根据生产规模和质量要求选择合适的测试设备。
255 1
|
算法 NoSQL Java
常用的限流算法有哪些?你听说过几种?
限流,就是指限制流量请求的频次。在高并发情况下,它是一种保护系统的策略,避免了在流量高峰时系统崩溃,造成系统的不可用。
670 1
|
存储 缓存 C语言
【C++】list介绍以及模拟实现(超级详细)
【C++】list介绍以及模拟实现(超级详细)
473 5

热门文章

最新文章