HashSet详解

2023-11-11

概述

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

HashSet介绍

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

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

以上是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);
    }
复制代码

运行结果:

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

核心机制

实现原理

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的属性,如下

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

总结

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


来源:https://juejin.cn/post/7136186724379525133

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HashSet详解 的相关文章

  • 如何使用固定数量的工作线程实现简单线程

    我正在寻找最简单 最直接的方法来实现以下内容 主程序实例化worker 执行任务的线程 Only n任务可以同时运行 When n已达到 不再有工人 开始直到计数 正在运行的线程回落到下方n 我觉得Executors newFixedThr
  • 如何配置 Spring-WS 以使用 JAXB Marshaller?

    感谢您到目前为止对此的帮助 我正在更新问题 因为我没有显示我需要的所有内容 并显示了建议的更改 肥皂输出仍然不是我想要的 servlet xml
  • 在命令行java中突出显示文本[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一项任务是重新创建 unix cal 程序 除了一部分之外 相当简单 今天 它突出显示了该数字 我不知道该怎么做 关于如何在 Ja
  • 项目缺少所需的注释处理库

    我的 Eclipse IDE 突然在问题视图中显示 xxxx 项目缺少所需的注释处理库 xxxx M2 REPO 中的一些旧 jar 我用谷歌搜索 没有找到任何答案 为什么我的项目使用旧的 jar 以及错误来自哪里 To remove th
  • 尝试获取屏幕上绘制的每个随机圆圈的 x、y 坐标

    您好 我正在制作一款游戏 该游戏将在屏幕上创建随机圆圈 随机创建的圆圈的值为红色或绿色 我的问题是 我希望不仅能够确定用户何时单击其中一个圆圈 而且还能够确定他们最终单击的圆圈 红色或绿色 下面是我的代码 我的主要问题是试图找到将要绘制的圆
  • 如何为小程序提供对文件系统写入的访问权限

    我在设置小程序的策略文件时遇到问题 我是第一次这样做 不知道如何在java中设置小程序的策略文件 实际上我想授予小程序在文件系统上写入的权限 为此我必须向小程序授予文件权限 所以我创建了一个名为 java policy 的文件 并将以下代码
  • 使用 JSch 分别为各个提示提供输入

    问题是 SSH 连接需要在常规登录后提供另一个用户 ID 和密码信息 我正在使用 JSch 连接到远程服务器 它接受以下形式的输入InputStream 和这个InputStream只能通过一次 由于会话是交互式的 这会导致问题 我尝试将输
  • 在 Junit 测试中使用 ReflectionTestUtils.setField()

    我是 JUnittesting 的新手 所以我有一个问题 谁能告诉我为什么我们使用ReflectionTestUtils setField 在我们的 Junit 测试示例中 正如评论中提到的 java 文档很好地解释了用法 但我还想给你们举
  • Android volley使用RequestFuture.get()时出现超时异常

    在我的片段中 我尝试使用 TMDB 的开放电影数据库来获取有关 正在播放 电影的详细信息 如果我使用 RequestFuture get time TimeUnit 方法来执行此齐射请求 我总是会收到超时错误 如果我在 Safari 中手动
  • java.lang.Object的hashCode具体使用的算法是什么

    中使用的算法是什么JVM实施java lang Object的隐含的hashCode 方法 OpenJDK or Oracle JDK答案中首选 它依赖于实现 并且在很大程度上 该算法是entirely取决于实施 只要它是一致的 但是 根据
  • Java 中的 ExecuteUpdate sql 语句不起作用

    我正在学习如何将 SQL 与 Java 结合使用 我已成功安装 JDBC 驱动程序 并且能够从数据库读取记录并将其打印在屏幕上 我的问题发生在尝试执行更新或插入语句时 没有任何反应 这是我的代码 问题所在的方法 public static
  • 将现有 eclipse 项目导出到 war 文件时出现“模块名称无效”

    我正在尝试将现有 Eclipse 项目导出到 war 文件 但无论我在 WAR Export 对话框页面中输入什么 系统总是返回 模块名称无效 我不知道如何解决这个问题 谢谢您的帮助 我有同样的问题 我修复了它 请按照以下步骤操作 您可以创
  • 如何使用 swagger-codegen-plugin (maven) 生成客户端代码?

    我需要使用 swagger codegen plugin for maven 在 eclipse 中生成服务器存根代码 你能帮忙怎么做吗 以及需要什么配置 在 pom xml 中 我找到了这个答案 您只需要像下面这样更改 pom xml 即
  • Jetty Plugin 9启动不喜欢icu4j-2.6.1.jar

    我对 mortbay 的 Maven jetty 插件 6 有相同的配置
  • java swing:向 JTree 项目添加自定义图形按钮

    我想在 JTree 中的项目右侧添加一个带有小图标的附加按钮 这可以做到吗 如果是这样 怎么办 thanks Clamp 你在这方面成功了吗 我想做同样的事情 但很难让 JButton 响应用户 设置渲染器以显示按钮的过程很顺利 但所有鼠标
  • 如何检查日期字符串的有效性?

    在我的项目中 我需要检查日期字符串是否计算为正确的日期对象 我决定允许 yyyy MM dd 和日期格式 年 月 日 和 年 月 日 小时 分钟 我如何检查它们是否有效 我的代码为 1980 01 01 和一些奇怪的日期 如 3837 05
  • Java String ReplaceAll 方法给出非法重复错误?

    我有一个字符串 当我尝试运行时replaceAll方法 我收到这个奇怪的错误 String str something op str str replaceAll o n it works fine str str replaceAll n
  • Java 中的微分方程

    我正在尝试用java创建一个简单的SIR流行病模型模拟程序 基本上 SIR 由三个微分方程组定义 S t l t S t I t l t S t g t I t R t g t I t S 易感人群 I 感染人群 R 康复人群 l t c
  • 你能快速告诉我这个伪代码是否有意义吗?

    我相信我的代码现在是万无一失的 我现在将写出伪代码 但我确实有一个问题 为什么 DRJava 要求我返回 if 语句之外的内容 正如你所看到的 我为 ex 写了 return 1 只是因为它问了 但是它永远不会返回该值 谁可以给我解释一下这
  • 使用 AmazonSNSClient 发送短信时的授权

    aws 官方文档如何发送短信 http docs aws amazon com sns latest dg sms publish to phone html使用 java 中的 aws SDK 非常简单 但是 当发送如底部示例所示的消息时

随机推荐

  • C++之模板特例化

    本文是转载的 https blog csdn net lisonglisonglisong article details 38057367 模板是C 中一个很重要的特性 写一份代码能用于多种数据类型 包括用户自定义类型 例如 STL的so
  • 数学库(math)

    数学库由一组标准的数学函数构成 包括三角函数 sin cos tan atan等 指数和对数函数 exp log log10 取整函数 floor ceil max和min 生成伪随机数的函数 random randomseed 以及变量p
  • STM32串口配置实验

    STM32 串口简介 串口作为 MCU 的重要外部接口 同时也是软件开发重要的调试手段 其重要性不言而喻 现在基本上所有的 MCU 都会带有串口 STM32 自然也不例外 STM32 的串口资源相当丰富的 功能也相当强劲 ALIENTEK
  • Springboot整合poi +vue实现导出导入Excle表格数据展示图形

    工具 idea 数据库 mysql 框架 Springboot 准备工作 1 导入主要依赖 poi
  • SpringBoot项目基础架构

    以下是一个简单的示例 展示了如何使用Spring Boot实现前后端分离项目 包含代码讲解和详细注释 创建项目 创建一个空的Spring Boot项目 设置依赖 使用你喜欢的构建工具 例如Maven 将以下依赖添加到项目的pom xml文件
  • 蓝桥杯-纸张尺寸

    问题描述 在 ISO 国际标准中定义了 A0 纸张的大小为 1189mm times 841mm 将 A0 纸 沿长边对折后为 A1 纸 大小为 841mm times 594mm 在对折的过程中长度直接取 下整 实际裁剪时可能有损耗 将
  • 避坑必看:很详尽的MyBatis返回自增主键实验(包括插入或更新SQL语句insert on duplicate key update的自增主键返回情况)

    目录 1 实验对比维度 1 单纯的insert和insert on duplicate key update 2 selectKey和useGeneratedKeys 3 Param和parameterType 4 单个和批量 5 keyP
  • linux密码永不过期命令,linux密码永不过期 linux修改用户密码永不过期

    linux下怎样设置某个用户的密码永不过期 Windows的空密码处理非常特殊 密码为空的用户禁止远程登录 Linux的空密码无法防止远程登录带来的安全风险 而且 即使禁止使用空密码的用户远程登录 如果Linux下的某个用户或服务被破坏 也
  • srand(time(NULL))是什么意思?

    第一 srand time NULL 是以当前时间为种子 产生随意数 其中 time NULL 用来获取当前时间 本质上得到的是一个大整数 然后用这个数来随机数 第二 这个错误应该是代码中写楼了什么东西造成的 最大的可能应该是大括号少了一半
  • 解决:TypeError: '(slice(None, None, None), 1)' is an invalid key

    问题背景 使用matplotlib将DBSCAN分类结果散点图可视化时提示此TypeError 源代码 from sklearn cluster import DBSCAN import pandas as pd import matplo
  • Logstash 入门:介绍 Java 的 Output Plugin

    Logstash 入门 介绍 Java 的 Output Plugin Logstash 是一个开源的数据收集和处理引擎 它可以从各种来源采集数据 并将其转换为可用于存储 分析和可视化的格式 Logstash 通过插件系统提供了灵活的扩展性
  • AD软件解决 Unknown Pin 和Failed to add class member 问题

    出现这个提示是因为现在的PCB里已经含有net的 只需要先删除所有现在板子上的net 然后再导入就不会出现这个提示 现在暂时不用管 点继续 同上继续 如何解决Unknown Pin问题 只需要删除现在PCB板子上所有的net就行了 具体如下
  • android 自定义空白,小米手机自定义空白卡模拟加密卡门禁卡教程

    小米手机自定义空白卡模拟加密卡门禁卡教程 使用MIUI自带门卡模拟功能 并尝试烧录完整数据 不依赖任何第三方软件 不会对系统做什么恶 意 修 改 也不会对其他依赖NFC的服务 小米公交 Mi Pay银行卡等 造成影响 1 准备工作 两台全功
  • POSTGRESQL 判断字段为空的方法

    1 IS NULL 和 IS NOT NULL 操作符 2 运用COALESCE函数进行字段的非空判断 并在第二个参数指定默认值
  • 利用稳压模块设计电源电路(洞洞板手工做板)

    前言 一块12伏的电池 要进行分压以适应多路的供电要求 因此做电源电路很有必要 本文采用洞洞板 稳压模块 手工焊接 1 实物 2 原理图 3 焊接 用焊锡连线 而不是用杜邦线跳线 焊锡线粗 可以保证大电流通过 而杜邦线太细了 容易烧毁 更甚
  • feign.FeignException$Unauthorized: status 401 reading UserOpenFeignService#findUser

    feign FeignException Unauthorized status 401 reading UserOpenFeignService findUser 如果是pig那边的问题 可以关了 文章针对的是单纯feign调用的问题 出
  • matlab自动深复制(deep copy)

    matlab 程序中 多次重复实验 而每次重复中会对数据 X 加一些随机噪声 此处希望每次重复时深复制一次 X 使得本次的噪声不会影响原数据 matlab 似乎能自动决定要不要复制一份 测试如下 Code matlab R2018a 原数据
  • 深入剖析智能仓储管理(WMS)应用价值与应用场景

    中国企业都在思考和部署如何实现一种高度自动化 高度信息化 高度网络化的生产模式 从而实现基于大数据的用户全息深层分析 本文目的在于交流如何建设适合自己企业的智能仓储 文 供应链指南针 孙亚博 2013年德国提出第四次工业革命 工业4 0的兴
  • linux开机自启动脚本以及update-rc.d命令解析

    linux有很多种自启动方式 这里只是简单记录下update rc d的自启动方式 update rc d的介绍 update rc d命令用于安装或移除System V风格的初始化脚本连接 脚本是存放在 etc init d 目录下的 我
  • HashSet详解

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