006 HashSet是如何去重的

2024-06-05 23:52
文章标签 hashset 006

本文主要是介绍006 HashSet是如何去重的,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • HashSet是如何去重的
      • 数据结构
      • 哈希函数与索引计算
      • 存储与去重
      • 查找与删除
      • 特征与总结

HashSet是如何去重的

数据结构

HashSet底层依赖于HashMap的数据结构,即一个哈希表。这个哈希表本质上是一个数组,数组的每个元素称为一个桶。每个桶中存储的不是单一元素,而是一个链表或红黑树(在Java8及以后的版本中,当链表长度超过一定阈值,如8时,会转化为红黑树以提高效率)

哈希函数与索引计算

当向HashSet中添加元素时,首先会调用元素的hashCode()方法计算哈希码。然后,通过某种散列函数(哈希函数)将这个哈希码转换为数组(即哈希表)的索引位置。这个索引位置就是元素应该存储的桶的位置。

存储与去重

存储过程:如果计算出的索引位置的桶为空,则直接将元素存入该桶中。如果桶中已经有其他元素(即发生哈希冲突),则需要遍历链表或红黑树来查找是否已经存在相同的元素。如果不存在相同的元素,则将新元素添加到链表或红黑树中;如果存在相同的元素,则不进行任何操作,从而保证了HashSet中元素的唯一性。

去重实现:HashSet的去重功能正是基于上述存储过程实现的。在添加新元素前,它会检查哈希表中是否已经存在该元素。如果存在,则不添加;如果不存在,则添加到哈希表中。这样,HashSet中就不会出现重复的元素。

查找与删除

查找:当从HashSet中查找一个元素时,也是首先使用哈希函数计算出元素的哈希值,并根据哈希值找到对应的桶。然后遍历链表或红黑树来查找是否存在相同的元素。

删除:删除操作与查找类似,首先定位到元素所在的桶,然后在链表或红黑树中查找并删除该元素

特征与总结

无序性:HashSet中的元素是无序的,因为哈希表不保证元素的顺序

唯一性:通过哈希函数和哈希表的结合使用,HashSet能够高效地实现元素的去重功能

性能:由于使用了哈希表和哈希函数,HashSet在插入、删除和查找操作上都具有较高的效率(平均时间复杂度接近O(1))。

总的来说,HashSet通过哈希表和哈希函数的运算,按照一定的算法将元素存储在桶中,可以实现快速的插入、删除和查找操作,并具有较高的效率。同时,由于其内部的去重机制,HashSet中的元素是无序且不重复的

在哈希表(Hash Table)的上下文中,“键”(Key)是指用于在哈希表中唯一标识一个条目的数据。在HashSet中,键通常是要存储的元素本身。每个元素都会通过哈希函数转换为一个哈希值,这个哈希值进一步被用来确定元素在哈希表中的存储位置(即桶的位置)。

简单来说,当你向HashSet中添加一个元素时,这个元素就是“键”。HashSet使用这个“键”来计算哈希值,并据此决定将元素存储在哪个桶中。在HashMap中,情况稍有不同,因为HashMap存储键值对(Key-Value Pair),其中“键”用于计算存储位置,并唯一标识一个特定的值(Value)。

在HashSet的情况下,由于只存储单一的元素而没有对应的“值”,所以元素本身就作为“键”来处理。这样,每个元素都会根据其自身的哈希值被放置在哈希表的适当位置,从而实现快速查找、插入和删除操作,并保证元素的唯一性。

HashSet之所以能够实现快速的插入、删除和查找操作,并具有去重机制,主要得益于其背后的数据结构和算法设计。以下是详细解释:

  1. 哈希表和哈希函数:
    • 哈希表(Hash Table)是一种根据键(Key)直接访问在内存存储位置的数据结构。
    • 哈希函数(Hash Function)是将键映射到一个位置(通常是一个数组索引)的算法。理想情况下,哈希函数会将不同的键映射到不同的位置,以最小化冲突。
  2. 高效的插入、删除和查找:
    • 当向HashSet中插入一个元素时,哈希函数会计算该元素的哈希值,然后将其放在哈希表对应的桶(Bucket)中。由于哈希函数的计算通常很快,且直接定位到存储位置,所以插入操作平均时间复杂度接近O(1)。
    • 查找和删除操作也类似,先通过哈希函数快速定位到元素可能所在的位置,然后进行查找或删除,因此这些操作的时间复杂度也接近O(1)。
  3. 去重机制:
    • 当插入一个新元素时,HashSet会首先计算该元素的哈希值,并检查对应桶中是否已经有相同哈希值的元素。
    • 如果有哈希冲突(即不同元素具有相同的哈希值),HashSet会使用链表或开放寻址法等方式解决冲突。在解决冲突的过程中,会检查冲突元素是否确实与新元素相同,以确保集合中元素的唯一性。
    • 这种机制保证了HashSet中的元素不会重复。
  4. 元素无序:
    • HashSet不保证元素的顺序,因为元素是根据其哈希值存储在哈希表中的不同桶中的。
    • 哈希表的设计目标是快速查找和插入,而不是保持元素的顺序。
    • 如果需要保持插入顺序,可以考虑使用LinkedHashSet,它在HashSet的基础上维护了一个双向链表来记录插入顺序。

综上所述,HashSet的高效性能和无重复特性主要得益于哈希表和哈希函数的设计。同时,由于其设计目标是快速查找和插入,因此不保证元素的顺序。如果需要有序集合,可以考虑使用TreeSet等其他数据结构。

这篇关于006 HashSet是如何去重的的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1034530

相关文章

容器第七课,Set,HashSet基本用法,源码分析

Set接口 Set接口是Collection接口的子接口,Set接口没有提供额外的方法,Set接口的特性是容器类中的元素是i没有顺序的,而且不可以重复。Set容易可以在数学中“集合”的概念相对应。J2SDK API中 所提供的Set容器类有HashSet、TreeSet等 package com.pkushutong.Collection;import java.util.HashSet;

【Rust】006-Rust 枚举与`match`、`if let`、`let else`

【Rust】006-Rust 枚举与match、if let、let else 文章目录 【Rust】006-Rust 枚举与`match`、`if let`、`let else`一、简介二、使用场景三、基本使用1、定义枚举2、使用枚举 四、功能详解1、带数据的枚举2、使用`match`进行模式匹配3、使用`if let`简化特定变体的处理4、使用`let else`处理带条件的匹配 五、

Java集合框架(Set与Map,HashSet与HashMap,TreeSet与TreeMap)

这是一个介绍集合类,数组以及容器关系的截图,便于我们对集合的理解。 一.Set和Map Set代表一种集合元素无序、不可重复的集合,Map则代表一种由多个key-value(键-值)对组成的集合。 从表面上看,它们之间的相似性很少,但实际上Map和Set之间有莫大的联系。可以说,Map集合是Set集合的扩展。 如果只考察Map集合的Key,不难发现,这些Map集合的key具有一个特

GeoScene Pro教程(006):GeoScenePro地图集制作

文章目录 1、加载数据2、修改地图样式3、修改外观4、显示上下左右各为哪个地市5、新建布局6、选择地图框显示区域7、插入指北针、比例尺、图例8、显示相邻地市9、导出地图 地图系列的构建来自单个地图图幅的集合,每个图幅显示 特定的地图范围,包含 动态地图元素和 静态地图元素。 以创建湖北省人口分布图地图集为例。 1、加载数据 添加图层:湖北省人口数据、湖北省道路

006 sql server界面视图分析 数据库结构

数据库结构 学习数据库,先了解一下sql server 的界面吧!人性化的界面帮助初学者更容易上手数据库。 数据库有系统数据库、数据库快照、reportserver 、reportserver tempDB和自定义数据库组成(employee、mysql、students)。   我把它分为四部分:系统数据库,数据库快照,ssrs,自定义数据库   一、系统数据库

006.Python爬虫系列_Web前端基础HTML+CSS

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈 入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈 虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈 PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)文章合集 👈👈 Oracle数据库教程:👉👉 Oracle数据库文章合集 👈👈 优

第一章 集合框架和泛型(ArrayList/LinkedList/HashSet/HashMap/泛型集合/Collections算法类)

第一章 集合框架和泛型 一、Collection 1、Collection 接口存储一组不唯一,无序的对象 二、List List 接口存储一组不唯一,有序(插入顺序)的对象 1.ArrayList 实现了长度可变的数组,在内存中分配连续的空间优点:遍历元素和随机访问元素的效率比较高ArrayList类是List接口的一个具体实现类ArrayList对象实现了可变大小

【Test 006】用图形化和代码的方式实现简单的Qt程序

文章目录 1. 通过图形化的方式实现🍎2. 通过代码的方式实现3. Qt 关于内存泄露相关4. 如何证明它自动调用 new ,统一销毁5. 乱码问题分析7. 总结 1. 通过图形化的方式实现🍎 在界面创建出一个控件,显示 hello world,通过拖拽的方式实现; widget.ui文件如下:🔍 生成的 ui_widget.h文件的setupU

Java重修笔记 第四十三天 Set 集合、HashSet 类

Set 接口 1. 它是无序的(添加和取出的顺序不一致,但取出的结果是固定的),没有索引 2. Set 接口也是 Collection 的子接口,所以继承了 Collection 的方法 3. Set 接口的遍历方式有两种,迭代器和增强 for 循环,但是不能使用索引遍历 HashSet 类 1. 底层是一个 HashMap,可以把 HashSet 看成 HashMap 2

Java重修笔记 第四十四天 HashSet 添加元素规则、树化规则和扩容规则

添加元素规则 1. HashSet 底层是 HashMap,所以他俩的逻辑是一样的 2. 添加一个元素时,先得到 hash 值再转成索引值(Hash值来自于却不等于HashCode()的值) 3. 看这个存储数据表 table 的索引位置是否已经存放有元素 4. 如果没有,直接加入  5. 如果有,则调用对象的 equals() 方法逐一进行比较,如果有相同的,就放弃添加,如果都不相