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

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

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

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]删除
最新教程 更多>
  • 如何实时捕获和流媒体以进行聊天机器人命令执行?
    如何实时捕获和流媒体以进行聊天机器人命令执行?
    在开发能够执行命令的chatbots的领域中,实时从命令执行实时捕获Stdout,一个常见的需求是能够检索和显示标准输出(stdout)在cath cath cant cant cant cant cant cant cant cant interfaces in Chate cant inter...
    编程 发布于2025-04-18
  • 如何使用PHP从XML文件中有效地检索属性值?
    如何使用PHP从XML文件中有效地检索属性值?
    从php $xml = simplexml_load_file($file); foreach ($xml->Var[0]->attributes() as $attributeName => $attributeValue) { echo $attributeName,...
    编程 发布于2025-04-18
  • 解决Hibernate“对象引用未保存的临时实例”错误方法
    解决Hibernate“对象引用未保存的临时实例”错误方法
    当实体具有包含尚未保存到数据库的新实例时,就会出现此错误。 Hibernate尝试在持续存在父对象时自动保存这些新实例,但是如果cascade属性不能适当设置。解决此问题,您需要指定cascade atteribute interction interclibute。这会告诉Hibernate保存...
    编程 发布于2025-04-18
  • Python不会对超范围子串切片报错的原因
    Python不会对超范围子串切片报错的原因
    在python中用索引切片范围:二重性和空序列索引单个元素不同,该元素会引起错误,切片在序列的边界之外没有。这种行为源于索引和切片之间的基本差异。索引一个序列,例如“示例” [3],返回一个项目。但是,切片序列(例如“示例” [3:4])返回项目的子序列。索引不存在的元素时,例如“示例” [9] ...
    编程 发布于2025-04-18
  • Java中Lambda表达式为何需要“final”或“有效final”变量?
    Java中Lambda表达式为何需要“final”或“有效final”变量?
    Lambda Expressions Require "Final" or "Effectively Final" VariablesThe error message "Variable used in lambda expression shou...
    编程 发布于2025-04-18
  • 如何将MySQL数据库添加到Visual Studio 2012中的数据源对话框中?
    如何将MySQL数据库添加到Visual Studio 2012中的数据源对话框中?
    在Visual Studio 2012 尽管已安装了MySQL Connector v.6.5.4,但无法将MySQL数据库添加到实体框架的“ DataSource对话框”中。为了解决这一问题,至关重要的是要了解MySQL连接器v.6.5.5及以后的6.6.x版本将提供MySQL的官方Visual...
    编程 发布于2025-04-18
  • 如何在GO编译器中自定义编译优化?
    如何在GO编译器中自定义编译优化?
    在GO编译器中自定义编译优化 GO中的默认编译过程遵循特定的优化策略。 However, users may need to adjust these optimizations for specific requirements.Optimization Control in Go Compi...
    编程 发布于2025-04-18
  • 从C#正确调用SQL自定义函数(UDF)方法
    从C#正确调用SQL自定义函数(UDF)方法
    在C#中调用SQL定义的SQL定义已定义的函数在使用C#代码的SQL定义的函数中查询数据库。这是您可以从C#代码中调用名为“ TCUPOM”的T-SQL标量函数的方法: c#代码: 原始代码中的错误:Setting the CommandType to StoredProcedure when ...
    编程 发布于2025-04-18
  • 如何在Java中正确显示“ DD/MM/YYYY HH:MM:SS.SS”格式的当前日期和时间?
    如何在Java中正确显示“ DD/MM/YYYY HH:MM:SS.SS”格式的当前日期和时间?
    如何在“ dd/mm/yyyy hh:mm:mm:ss.ss”格式“ gormat 解决方案:的,请访问量很大,并应为procectiquiestate的,并在整个代码上正确格式不多: java.text.simpledateformat; 导入java.util.calendar; 导入java...
    编程 发布于2025-04-18
  • 为什么HTML无法打印页码及解决方案
    为什么HTML无法打印页码及解决方案
    无法在html页面上打印页码? @page规则在@Media内部和外部都无济于事。 HTML:Customization:@page { margin: 10%; @top-center { font-family: sans-serif; font-weight: bo...
    编程 发布于2025-04-18
  • 您如何在Laravel Blade模板中定义变量?
    您如何在Laravel Blade模板中定义变量?
    在Laravel Blade模板中使用Elegance 在blade模板中如何分配变量对于存储以后使用的数据至关重要。在使用“ {{}}”分配变量的同时,它可能并不总是最优雅的解决方案。幸运的是,Blade通过@php Directive提供了更优雅的方法: $ old_section =“...
    编程 发布于2025-04-18
  • Go模板范围中如何避免尾随逗号?
    Go模板范围中如何避免尾随逗号?
    在GO的文本模板中的最后一个元素的特殊情况处理处理范围的最后一个元素时,可能很棘手。以创建类似“(P1,P2,P3)”之类的字符串的任务。如果您使用一个简单的范围循环,则最终可能会在末端获得一个额外的逗号,从而导致“(P1,P2,P3,)”。 来解决此问题,我们可以利用模板范围的关键功能:声明两个...
    编程 发布于2025-04-18
  • 如何实现文本框自动高度调整?
    如何实现文本框自动高度调整?
    textarea auto height 探索如何自动调整文本核心的高度以匹配其内容的长度,以符合其内容的长度他们包含的文本量。如果文本超过预定义的高度,它将变得无法访问并需要滚动。此处提供的解决方案使用纯JavaScript根据其实际内容来调整文本方面的高度。定义了一个称为“ auto_gro...
    编程 发布于2025-04-18
  • Python元类工作原理及类创建与定制
    Python元类工作原理及类创建与定制
    python中的metaclasses是什么? Metaclasses负责在Python中创建类对象。就像类创建实例一样,元类也创建类。他们提供了对类创建过程的控制层,允许自定义类行为和属性。在Python中理解类作为对象的概念,类是描述用于创建新实例或对象的蓝图的对象。这意味着类本身是使用类关...
    编程 发布于2025-04-18
  • 如何使用不同数量列的联合数据库表?
    如何使用不同数量列的联合数据库表?
    合并列数不同的表 当尝试合并列数不同的数据库表时,可能会遇到挑战。一种直接的方法是在列数较少的表中,为缺失的列追加空值。 例如,考虑两个表,表 A 和表 B,其中表 A 的列数多于表 B。为了合并这些表,同时处理表 B 中缺失的列,请按照以下步骤操作: 确定表 B 中缺失的列,并将它们添加到表的末...
    编程 发布于2025-04-18

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

Copyright© 2022 湘ICP备2022001581号-3