”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 探索 HashSet:深入研究无序集合

探索 HashSet:深入研究无序集合

发布于2024-11-08
浏览:839

Exploring HashSet: A Dive into Unordered Collections

介绍

HashSet 类是 Java 集合框架的一部分,提供快速、无序的集合,不允许重复元素。它构建在 HashMap 之上,这意味着它继承了相同的时间复杂度优势,但纯粹关注元素唯一性。在本文中,我们将探讨 HashSet 的工作原理、它的独特之处以及它与其他集合的不同之处。


什么是哈希集?

哈希集是:

  • 无序:元素没有可预测的顺序。
  • 唯一:忽略重复元素。
  • 内部由HashMap支持:它使用HashMap来存储元素,仅关注而丢弃值。
  • O(1)平均时间复杂度:插入、删除、查找等操作效率很高。

1. 初始化HashSet

// Parameterized constructor with initial capacity
Set setWithInitialCapacity = new HashSet(5);

// Parameterized constructor using a collection
Set setWithCollection = new HashSet(Arrays.asList(4, 4, 3));

// Default constructor with default capacity 16
Set set = new HashSet();

解释:

  • 默认构造函数: 创建一个初始容量为 16 的 HashSet。
  • 参数化构造函数:可以指定初始容量,但注意容量与大小不同。大小是指集合中实际元素的数量。
  • 使用集合: 可以从像列表这样的集合创建 HashSet,确保只保留唯一元素。

2. 向 HashSet 添加元素

set.add(1);
set.add(2);
set.add(1); // Duplicate value is ignored
System.out.println(set); // Output -> [1, 2]

解释:

  • add()方法将元素插入到HashSet中。
  • 重复元素将被忽略。 当您尝试将 1 添加两次时,仅保留第一次出现的元素。

要点

如果您需要替换重复值而不是忽略它们,HashSet 将不是正确的选择。这是因为它优先考虑元素的唯一性


3. 检查尺寸与容量

// Parameterized constructor with initial capacity
Set setWithInitialCapacity = new HashSet(5);
System.out.println(setWithInitialCapacity.size()); // Output -> 0

尽管 setWithInitialCapacity 的容量为 5,但 size 为 0,因为 size 反映的是集合中存在的元素数量,而不是初始容量。您可以将容量视为内部存储空间,它会随着元素的添加而调整。


4. 将 HashSet 与集合一起使用

// Parameterized constructor using a collection
Set setWithCollection = new HashSet(Arrays.asList(4, 4, 3));
System.out.println(setWithCollection); // Output -> [3, 4] or [4, 3]

解释:

  • 尽管列表中提供了三个元素(4、4、3),但重复值4被丢弃,只留下两个元素(3和4)。
  • 元素的顺序是不可预测的因为HashSet不维护任何插入或自然顺序。

如果需要保留已排序的元素,请考虑使用TreeSet,它确保元素按升序排列


5. HashSet 中的索引 – 可能吗?

在面试中,一个常见的问题是是否可以检索 HashSet 中元素的索引。答案是,因为HashSet使用哈希机制来存储元素,而不是像列表或数组那样基于索引的结构。


要点总结

  1. 无序且唯一: HashSet 只保留唯一元素,忽略重复项。
  2. 基于HashMap:它使用内部HashMap的键来存储元素。
  3. 快速操作:添加、删除和检查元素的平均时间复杂度为O(1)
  4. 容量与大小:容量是分配的空间,而大小是实际的元素数量。
  5. 无索引:由于哈希机制,您无法通过索引检索元素。

与HashMap的关系

由于HashSet由HashMap支持,因此它使用映射的来存储元素,而值是不相关的。这就是为什么 HashSet 中的每个元素都必须是唯一的,就像 HashMap 中的键一样。


结论

当您需要快速、无序的集合来避免重复时,HashSet 是一个强大的工具。虽然它为大多数操作提供了 O(1) 时间复杂度,但它缺乏排序和索引等功能。对于开发人员来说,了解 HashSet 与 HashMap 的关系有助于理解其内部工作原理并更好地利用集合框架。

在下一篇文章中,我们将探讨面试中常见的面试问题,以测试候选人对集合概念的了解。


相关帖子

  • Java 基础知识

  • Array面试要点

  • Java 内存基础知识

快乐编码!

版本声明 本文转载于:https://dev.to/arshisaxena26/exploring-hashset-a-dive-into-unordered-collections-4ehb?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • PHP SimpleXML解析带命名空间冒号的XML方法
    PHP SimpleXML解析带命名空间冒号的XML方法
    在php 很少,请使用该限制很大,很少有很高。例如:这种技术可确保可以通过遍历XML树和使用儿童()方法()方法的XML树和切换名称空间来访问名称空间内的元素。
    编程 发布于2025-05-07
  • 如何将PANDAS DataFrame列转换为DateTime格式并按日期过滤?
    如何将PANDAS DataFrame列转换为DateTime格式并按日期过滤?
    Transform Pandas DataFrame Column to DateTime FormatScenario:Data within a Pandas DataFrame often exists in various formats, including strings.使用时间数据时...
    编程 发布于2025-05-07
  • 如何使用Python的请求和假用户代理绕过网站块?
    如何使用Python的请求和假用户代理绕过网站块?
    如何使用Python的请求模拟浏览器行为,以及伪造的用户代理提供了一个用户 - 代理标头一个有效方法是提供有效的用户式header,以提供有效的用户 - 设置,该标题可以通过browser和Acterner Systems the equestersystermery和操作系统。通过模仿像Chro...
    编程 发布于2025-05-07
  • 找到最大计数时,如何解决mySQL中的“组函数\”错误的“无效使用”?
    找到最大计数时,如何解决mySQL中的“组函数\”错误的“无效使用”?
    如何在mySQL中使用mySql 检索最大计数,您可能会遇到一个问题,您可能会在尝试使用以下命令:理解错误正确找到由名称列分组的值的最大计数,请使用以下修改后的查询: 计数(*)为c 来自EMP1 按名称组 c desc订购 限制1 查询说明 select语句提取名称列和每个名称...
    编程 发布于2025-05-07
  • 如何使用Python理解有效地创建字典?
    如何使用Python理解有效地创建字典?
    在python中,词典综合提供了一种生成新词典的简洁方法。尽管它们与列表综合相似,但存在一些显着差异。与问题所暗示的不同,您无法为钥匙创建字典理解。您必须明确指定键和值。 For example:d = {n: n**2 for n in range(5)}This creates a dicti...
    编程 发布于2025-05-07
  • 在PHP中如何高效检测空数组?
    在PHP中如何高效检测空数组?
    在PHP 中检查一个空数组可以通过各种方法在PHP中确定一个空数组。如果需要验证任何数组元素的存在,则PHP的松散键入允许对数组本身进行直接评估:一种更严格的方法涉及使用count()函数: if(count(count($ playerList)=== 0){ //列表为空。 } 对...
    编程 发布于2025-05-07
  • 如何将多种用户类型(学生,老师和管理员)重定向到Firebase应用中的各自活动?
    如何将多种用户类型(学生,老师和管理员)重定向到Firebase应用中的各自活动?
    Red: How to Redirect Multiple User Types to Respective ActivitiesUnderstanding the ProblemIn a Firebase-based voting app with three distinct user type...
    编程 发布于2025-05-07
  • 用户本地时间格式及时区偏移显示指南
    用户本地时间格式及时区偏移显示指南
    在用户的语言环境格式中显示日期/时间,并使用时间偏移在向最终用户展示日期和时间时,以其localzone and格式显示它们至关重要。这确保了不同地理位置的清晰度和无缝用户体验。以下是使用JavaScript实现此目的的方法。方法:推荐方法是处理客户端的Javascript中的日期/时间格式化和时...
    编程 发布于2025-05-07
  • 您如何在Laravel Blade模板中定义变量?
    您如何在Laravel Blade模板中定义变量?
    在Laravel Blade模板中使用Elegance 在blade模板中如何分配变量对于存储以后使用的数据至关重要。在使用“ {{}}”分配变量的同时,它可能并不总是最优雅的解决方案。幸运的是,Blade通过@php Directive提供了更优雅的方法: $ old_section =“...
    编程 发布于2025-05-07
  • 解决MySQL插入Emoji时出现的\\"字符串值错误\\"异常
    解决MySQL插入Emoji时出现的\\"字符串值错误\\"异常
    Resolving Incorrect String Value Exception When Inserting EmojiWhen attempting to insert a string containing emoji characters into a MySQL database us...
    编程 发布于2025-05-07
  • 我可以将加密从McRypt迁移到OpenSSL,并使用OpenSSL迁移MCRYPT加密数据?
    我可以将加密从McRypt迁移到OpenSSL,并使用OpenSSL迁移MCRYPT加密数据?
    将我的加密库从mcrypt升级到openssl 问题:是否可以将我的加密库从McRypt升级到OpenSSL?如果是这样,如何?答案:是的,可以将您的Encryption库从McRypt升级到OpenSSL。可以使用openssl。附加说明: [openssl_decrypt()函数要求iv参...
    编程 发布于2025-05-07
  • 为什么我在Silverlight Linq查询中获得“无法找到查询模式的实现”错误?
    为什么我在Silverlight Linq查询中获得“无法找到查询模式的实现”错误?
    查询模式实现缺失:解决“无法找到”错误在Silverlight应用程序中,尝试使用LINQ建立LINQ连接以错误而实现的数据库”,无法找到查询模式的实现。”当省略LINQ名称空间或查询类型缺少IEnumerable 实现时,通常会发生此错误。 解决问题来验证该类型的质量是至关重要的。在此特定实例中...
    编程 发布于2025-05-07
  • 如何从PHP中的Unicode字符串中有效地产生对URL友好的sl。
    如何从PHP中的Unicode字符串中有效地产生对URL友好的sl。
    为有效的slug生成首先,该函数用指定的分隔符替换所有非字母或数字字符。此步骤可确保slug遵守URL惯例。随后,它采用ICONV函数将文本简化为us-ascii兼容格式,从而允许更广泛的字符集合兼容性。接下来,该函数使用正则表达式删除了不需要的字符,例如特殊字符和空格。此步骤可确保slug仅包含...
    编程 发布于2025-05-07
  • FastAPI自定义404页面创建指南
    FastAPI自定义404页面创建指南
    response = await call_next(request) if response.status_code == 404: return RedirectResponse("https://fastapi.tiangolo.com") else: ...
    编程 发布于2025-05-07
  • 为什么我会收到MySQL错误#1089:错误的前缀密钥?
    为什么我会收到MySQL错误#1089:错误的前缀密钥?
    mySQL错误#1089:错误的前缀键错误descript [#1089-不正确的前缀键在尝试在表中创建一个prefix键时会出现。前缀键旨在索引字符串列的特定前缀长度长度,以便更快地搜索这些前缀。理解prefix keys `这将在整个Movie_ID列上创建标准主键。主密钥对于唯一识别...
    编程 发布于2025-05-07

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3