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

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

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

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]删除
最新教程 更多>
  • 托管平台列表:综合指南
    托管平台列表:综合指南
    在数字时代,可靠的托管平台对于任何在线展示都至关重要,无论是个人博客、电子商务网站还是公司网站。有无数的选项可供选择,选择合适的托管平台可能会令人畏惧。本指南将帮助您浏览当今一些最好的托管平台,比较它们的功能、价格和对不同需求的适用性。 1. 蓝色主机 概述:Bluehost 是最受...
    编程 发布于2024-11-08
  • 在浏览器中将视频压缩为 webm
    在浏览器中将视频压缩为 webm
    ?增强您的网络视频:使用 React 将 MP4 压缩为 WebM 工作中没有任何有趣的事情感到无聊吗?好吧,就在那时我决定抓紧时间修补浏览器 API 的当前状态。我们可以直接通过 Web API 压缩视频吗?在这篇博客中,我将向您展示如何使用现代浏览器功能将 MP4 视频压缩为 ...
    编程 发布于2024-11-08
  • 现代 PHP 中的 PHP Fiber 并发性
    现代 PHP 中的 PHP Fiber 并发性
    PHP Fibers 在 PHP 8.1 中引入,带来了一种令人兴奋的新方法来处理 PHP 中的并发和异步编程。纤维允许您在执行过程中暂停和恢复函数,使开发人员能够更好地控制非阻塞操作,例如处理 I/O、数据库查询或 HTTP 请求,而无需停止整个脚本。 在本博客中,我们将探讨 PHP 纤维、它们的...
    编程 发布于2024-11-08
  • Laravel 的新时代:Accel 的百万美元 A 轮融资——这就是为什么它改变了游戏规则!
    Laravel 的新时代:Accel 的百万美元 A 轮融资——这就是为什么它改变了游戏规则!
    各位,请戴好帽子! Laravel 刚刚发布了一些激动人心的消息,震惊了开发界——由 Accel 领投的 A 轮融资 5700 万美元。作为一名热情的 Laravel 用户和企业家同事,这一公告在整个 PHP 社区引起了震动,我感到非常兴奋!那么,让我们来分析一下为什么这项投资意义重大,以及为什么 ...
    编程 发布于2024-11-08
  • C++11 的 `string::c_str()` 仍然以 Null 终止吗?
    C++11 的 `string::c_str()` 仍然以 Null 终止吗?
    C 11 的 string::c_str() 是否消除空终止?在 C 11 中,string::c_str 不再保证产生一个以 null 结尾的字符串。原因:在 C 11 中, string::c_str 的定义与 string::data 相同,而 string::data 又被定义相当于 *(b...
    编程 发布于2024-11-08
  • 数据分析师清单
    数据分析师清单
    SQL 清单 Excel女士清单 Power BI 清单 Tableau 清单 Python 清单 关注此 WhatsApp 频道以获取更多资源
    编程 发布于2024-11-08
  • 如何在 Go 中将 YAML 字段动态解析为有限结构集?
    如何在 Go 中将 YAML 字段动态解析为有限结构集?
    在 Go 中将 YAML 字段动态解析为有限结构体集简介在 Go 中将 YAML 解析为结构体非常简单。但是,当 YAML 字段可以表示多个可能的结构时,任务就会变得更加复杂。本文探讨了使用 Go 的 YAML 包的动态方法。使用 YAML v2 进行动态解组对于 Yaml v2,可以使用以下方法:...
    编程 发布于2024-11-08
  • 如何在 Python 中执行指数和对数曲线拟合?
    如何在 Python 中执行指数和对数曲线拟合?
    曲线拟合:Python 中的指数和对数方法虽然 Python 中可以使用 polyfit() 轻松进行多项式曲线拟合,但本指南探讨了指数和对数曲线的方法拟合。对数拟合要拟合 y = A B log x 形式的直线,只需执行 y 对 log x 的多项式拟合。import numpy as np x ...
    编程 发布于2024-11-08
  • 大批
    大批
    方法是可以在对象上调用的 fns 数组是对象,因此它们在 JS 中也有方法。 slice(begin):将数组的一部分提取到新数组中,而不改变原始数组。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index p...
    编程 发布于2024-11-08
  • 如何实现ES6模块的条件导入?
    如何实现ES6模块的条件导入?
    ES6模块的条件导入在ES6中,'import'和'export'关键字只能出现在模块的顶层模块。这可以防止条件导入,这是许多应用程序中的常见要求。这个问题探讨了这个问题的解决方案。最初,用户尝试使用条件语句导入模块,但这导致了语法错误。然后,用户使用 System....
    编程 发布于2024-11-08
  • 我们应该在 C++ 函数原型中使用异常说明符吗?
    我们应该在 C++ 函数原型中使用异常说明符吗?
    C 中的异常:我们应该在函数原型中指定它们吗?在 C 中,异常说明符允许函数声明它们是否可以抛出异常。然而,由于对其有效性和后果的担忧,它们的使用受到了质疑。反对使用异常说明符的原因:执行不力: 编译器并不严格强制执行异常说明符,因此违反它们可能不会导致错误。这会破坏它们的可靠性。程序终止:违反异常...
    编程 发布于2024-11-08
  • Python 的 If 语句中何时使用 and 关键字进行逻辑连接?
    Python 的 If 语句中何时使用 and 关键字进行逻辑连接?
    Python If 语句中的逻辑 AND在 Python 中使用 if 语句时,必须使用正确的逻辑运算符来计算多个条件。逻辑与运算符在许多编程语言中用 && 表示,它评估两个操作数的真实性,并且仅当两个操作数都为 true 时才返回 True。但是,在 Python 的 if 语句中,&& 不被识别...
    编程 发布于2024-11-08
  • 什么是 Redux,我们如何使用它?
    什么是 Redux,我们如何使用它?
    What is Redux, and how do we use it? Redux is like a helpful tool for managing the state of JavaScript programs. It helps keep everything organized an...
    编程 发布于2024-11-08
  • 唯一索引可以删除具有现有重复项的表中的重复项吗?如何删除?
    唯一索引可以删除具有现有重复项的表中的重复项吗?如何删除?
    通过唯一索引去重为了防止重复数据插入,错误地为字段A、B创建了普通索引, C、D,导致2000万条记录的表中存在重复记录。问题出现了:为这些字段添加唯一索引会在不影响现有字段的情况下删除重复项吗?更正索引并处理重复项添加唯一索引不带 IGNORE 修饰符的 ALTER TABLE 语句将失败,因为唯...
    编程 发布于2024-11-08
  • Java 中的 Setters 和 Record
    Java 中的 Setters 和 Record
    record是一种结构,其特点是不可变,也就是说,一旦创建了record类型的对象,它的属性不能修改,它相当于其他编程语言所说的data-class或DTO(数据传输对象)。但是,如果需要使用setter方法修改某个属性,并且考虑到记录中的每个属性都是final类型,那么如何实现呢? 为了证明这是否...
    编程 发布于2024-11-08

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

Copyright© 2022 湘ICP备2022001581号-3