当前位置: 首页 > news >正文

集合框架:Set集合的特点、HashSet集合的底层原理、哈希表、实现去重复

Set集合的特点

Set(集合)是一种无序的、不重复的数据结构,它的特点如下:

1. 集合中的元素是无序的:Set 中的元素没有顺序,无法通过索引来访问。

2. 集合中的元素是唯一的:Set 中不允许有重复的元素,每个元素在集合中只能出现一次。

3. 内部实现采用哈希表或树形结构:Set 内部通常是基于哈希表或平衡树等数据结构实现的。

4. 可以用于去重和快速查找:因为 Set 中的元素是唯一的,所以可以很方便地用来做去重操作。同时,由于内部实现采用哈希表或树形结构,所以查找某个元素的时间复杂度为 O(1) 或 O(log n)。

5. Set 中的元素必须是可哈希的:由于 Set 中的元素是基于哈希表实现的,所以集合中的元素必须是可哈希的,即元素必须有一个明确的哈希值。如果一个元素没有哈希值,那么它就不能被用作 Set 的元素。

注意:

Set要用到的常用方法,基本上就是Collection提供的!自己几乎没有额外新增一些常用方法!

练习代码

import java.util.Set;
import java.util.TreeSet;public class Test_set {public static void main(String[] args) {//1.创建一个set集合对象//HashSet:无序,不重复,无索引//Set<Integer> set = new HashSet<>(); //创建了一个HashSet的集合对象   一行经典代码//LinkedHashSet:有序,不重复,无索引//Set<Integer> set = new LinkedHashSet<>(); //创建了一个LinkedHashSet的集合对象//TreeSet:可排序(默认升序),不重复,无索引Set<Integer> set = new TreeSet<>(); //创建了一个TreeSet的集合对象set.add(666);set.add(555);set.add(555);set.add(888);set.add(888);set.add(777);set.add(777);System.out.println(set);}
}

哈希值

在学习HashSet集合的底层原理之前,我们先来了解一下什么是哈希值↓↓↓

概念

哈希值(Hash Value)是指将任意长度的数据映射为固定长度的值,通常用一个整数或固定长度的字节数组表示。哈希值也被称为散列值(Hash Code)或摘要(Digest)。

特点

在计算机领域,哈希值经常用于数据的存储、索引和加密等操作。它具有以下特点:

1. 哈希值是固定长度的:无论输入数据的长度是多少,哈希函数都会生成固定长度的哈希值。例如,常见的哈希算法 MD5 生成的哈希值为 128 位,SHA-1 的哈希值为 160 位。

2. 输入数据的微小改变会导致哈希值的巨大变化:只需改变输入数据的微小部分,哈希值就会发生巨大的变化。这种特性称为"雪崩效应",使得哈希值在校验数据的完整性时非常有用。

3. 哈希值一般是不可逆的:通常情况下,根据哈希值无法推导出原始数据的内容。哈希函数设计成使得产生相同哈希值的原始数据非常困难。

4. 相同的输入数据生成相同的哈希值:哈希函数对于相同的输入数据总是生成相同的哈希值,这方便进行数据的存储和比较。

5. 哈希值的分布应该均匀:良好的哈希函数应该能够将输入数据均匀地映射到哈希值空间,尽量避免碰撞(多个不同的输入数据生成相同的哈希值)。

java中Object类提供的public int hashCode()方法可以返回对象的哈希码值。

HashSet集合的底层原理

在 HashSet 中,元素被存储在一个 HashMap 的实例中,其中元素的值作为键(key),而键的哈希值(通过调用元素的 hashCode() 方法)则用来确定元素在哈希表中的位置。当要将一个元素加入 HashSet 时,HashSet 会首先计算该元素的哈希值,然后找到对应的存储位置。如果该位置上已经存在了元素,HashSet 会使用 equals() 方法来检查这两个元素是否相等,如果相等则认为是重复元素,不会将其加入集合。

简单来说,HashSet 的底层原理是基于哈希表实现的,使用哈希值来快速查找元素,并提供了高效的添加、删除和查找操作。

哈希表

既然HashSet集合是基于哈希表实现的,那么我们就来学习下哈希表↓↓↓

哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。

给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。

实现去重复

先来看一段代码

import java.util.HashSet;
import java.util.Set;public class Test {public static void main(String[] args) {//深入了解HashSet的去重复机制Set<Student> students = new HashSet<>();Student st1 = new Student("至尊宝",18,167.5);Student st2 = new Student("蜘蛛精",22,169.8);Student st3 = new Student("蜘蛛精",22,169.8);Student st4 = new Student("牛魔王",19,183.5);students.add(st1);students.add(st2);students.add(st3);students.add(st4);System.out.println(students);}
}

运行一下

这里面有两个内容相同的不同对象st1和st2,那么HashSet集合默认是不能去重复的。在实际操作中,我们希望只留下一个对象来表示,该怎么做呢?

//内容一样的两个对象,HashSet认为他们是不重复的/*
如果希望Set集合认为两个内容一样的对象是重复的,必须重写对象的hashcode()和equals()方法*/

我们可以去Student类中重写hashcode()和equals()方法

import java.util.Objects;public class Student {private String name;private int age;private double height;public Student() {}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Student student = (Student) o;return age == student.age && Double.compare(height, student.height) == 0 && Objects.equals(name, student.name);}@Overridepublic int hashCode() {return Objects.hash(name, age, height);}public Student(String name, int age, double height) {this.name = name;this.age = age;this.height = height;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public double getHeight() {return height;}public void setHeight(double height) {this.height = height;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +", height=" + height +'}';}
}

这样就只会有一个蜘蛛精留下了↓

篇幅问题,这篇博客到此结束了,下一篇文章我会详细介绍JDK8前后的两种哈希表,需要的朋友可以留意一下~

相关文章:

集合框架:Set集合的特点、HashSet集合的底层原理、哈希表、实现去重复

Set集合的特点 Set&#xff08;集合&#xff09;是一种无序的、不重复的数据结构&#xff0c;它的特点如下&#xff1a; 1. 集合中的元素是无序的&#xff1a;Set 中的元素没有顺序&#xff0c;无法通过索引来访问。 2. 集合中的元素是唯一的&#xff1a;Set 中不允许有重复…...

【T690 之十二】基于方寸EVB2开发板(T690芯片)构建基于GMSSL的文件系统的方式

备注&#xff1a; 1&#xff0c;假设您已对方寸微电子的T690系列芯片的使用方式都有了一定的了解&#xff0c;然后需要构建基于GMSSL的文件系统&#xff0c;此文才对您有意义&#xff1b; 2&#xff0c;若您对方寸微电子的T690芯片不了解&#xff0c;但想进一步了解它&#xff…...

使用Selenium发邮件附件

发邮件可以使用SMTP协议实现程序去发送&#xff0c;但附件的不能太大&#xff0c;一般不超过20M。 以下使用Selenium模拟发送邮件&#xff0c;跳过这个限制&#xff0c;网上找了很多资料&#xff0c;都没有完整实现的&#xff0c;那么自己实现一个&#xff0c;以下代码用Python…...

公共数据这座金矿,授权运营为何是赋能的关键路径?

数据要素市场化正开启下一个关键阶段。 自2014年大数据写入政府工作报告&#xff0c;到全国各地大数据交易所涌现&#xff0c;再到《数据二十条》颁布&#xff0c;中国数据要素产业探索之路已走过近十载。如今&#xff0c;国家大数据局正式成立&#xff0c;更是标志着数据要素…...

昇腾CANN 7.0 黑科技:大模型推理部署技术解密

CANN作为最接近昇腾AI系列硬件产品的一层&#xff0c;通过软硬件联合设计&#xff0c;打造出适合昇腾AI处理器的软件架构&#xff0c;充分使能和释放昇腾硬件的澎湃算力。针对大模型推理场景&#xff0c;CANN最新发布的CANN 7.0版本有机整合各内部组件&#xff0c;支持大模型的…...

OAuth 2.0

OAuth 2.0 是一种授权机制&#xff0c;允许应用程序访问第三方服务的用户数据&#xff0c;而不需要用户提供用户名和密码。其原理包括以下几个步骤&#xff1a; 应用程序向第三方服务请求授权&#xff0c;并提供自己的身份信息。 第三方服务向用户展示授权请求的具体内容和应用…...

7个设计师必备的Figma汉化插件,高效设计超简单!

Figma是一个著名的在线设计工具&#xff0c;拥有来自全球各地的超多设计师都在用&#xff0c;粉丝多多。其强大和灵活的设计功能使许多设计师都喜欢使用它。然而&#xff0c;为了进一步提高设计效率和扩展功能&#xff0c;许多开发人员开发了各种有用的Figma设计的汉化插件。在…...

缓存-基础理论和Guava Cache介绍

缓存-基础理论和Guava Cache介绍 缓存基础理论 缓存的容量和扩容 缓存初始容量、最大容量&#xff0c;扩容阈值以及相应的扩容实现。 缓存分类 本地缓存&#xff1a;运行于本进程中的缓存&#xff0c; 如Java的 concurrentHashMap, Ehcache&#xff0c;Guava Cache。 分布式缓…...

机器人伺服驱动控制环

伺服驱动器​的控制环&#xff0c;包括&#xff1a;位置环、速度环、电流环这三种类型。 对于伺服的控制回路&#xff0c;内侧控制环的响应带宽一般会是外侧控制环的5到10倍。也就是说&#xff0c;电流环带宽大致是速度环的5到10倍&#xff0c;速度环带宽则约为位置环的5到10倍…...

单链表(3)

现在有一个指针p&#xff0c;指向数据2所在的结点的地址——那么如何访问这个数据2 前面说过指针访问数据成员使用的是 指向符->。则访问这个数据2就是——p->data.因为p一开始就指向数据2的结点地址了 那么如何访问数据3,4往后等等 访问3就是——p->next->data…...

Android14前台服务适配指南

Android14前台服务适配指南 Android 10引入了android:foregroundServiceType属性&#xff0c;用于帮助开发者更有目的地定义前台服务。这个属性在Android 14中被强制要求&#xff0c;必须指定适当的前台服务类型。以下是可选择的前台服务类型&#xff1a; camera: 相机应用。…...

Spring Boot中使用Spring Data JPA访问MySQL

Spring Data JPA是Spring框架提供的用于简化JPA&#xff08;Java Persistence API&#xff09;开发的数据访问层框架。它通过提供一组便捷的API和工具&#xff0c;简化了对JPA数据访问的操作&#xff0c;同时也提供了一些额外的功能&#xff0c;比如动态查询、分页、排序等。 …...

Go 语言函数闭包(匿名函数)

Go 语言函数闭包&#xff08;匿名函数&#xff09; 在Go语言中&#xff0c;闭包是一种特殊的匿名函数&#xff0c;它可以捕获并访问其周围的变量。闭包允许将函数与其引用的环境捆绑在一起&#xff0c;使得函数可以在其创建的范围之外继续使用这些变量。以下是关于Go语言闭包的…...

2023年11月编程语言流行度排名

点击查看最新编程语言流行度排名&#xff08;每月更新&#xff09; 2023年11月编程语言流行度排名 编程语言流行度排名是通过分析在谷歌上搜索语言教程的频率而创建的 一门语言教程被搜索的次数越多&#xff0c;大家就会认为该语言越受欢迎。这是一个领先指标。原始数据来自…...

apache-maven-3.6.3 安装配置教程

链接&#xff1a;https://pan.baidu.com/s/1RkMXipnvac9EKcZyUStfGQ?pwdl32m 提取码&#xff1a;l32m 1. 将 maven 压缩包解压至指定文件夹 2. 配置环境变量 &#xff08;1&#xff09;打开此电脑-> 鼠标右键选择属性->点击高级系统设置 &#xff08;2&#xff09;点…...

你一般什么时候使用GPT

一般在寻求帮助的时候才使用gpt 一个优秀的gpt项目gpt-on-web...

kubernetes (k8s)的使用

一、kubernetes 简介 谷歌2014年开源的管理工具项目&#xff0c;简化微服务的开发和部署。 提供功能&#xff1a;自愈和自动伸缩、调度和发布、调用链监控、配置管理、Metrics监控、日志监控、弹性和容错、API管理、服务安全等。官网&#xff1a;https://kubernetes.io/zh-cn…...

RK3568平台开发系列讲解(音视频篇)RTMP 推流

🚀返回专栏总目录 文章目录 一、RTMP 的工作原理二、RTMP 流媒体服务框架2.1、Nginx 流媒体服务器2.2、FFmpeg 推流沉淀、分享、成长,让自己和他人都能有所收获!😄 📢目前常见的视频监控和视频直播都是使用了 RTMP、RTSP、HLS、MPEG-DASH、 WebRTC流媒体传输协议等。 R…...

掌握这几个技巧,才敢称为Jenkins大神!

01、Performance插件兼容性问题 自由风格项目中&#xff0c;有使用 Performance 插件收集构建产物&#xff0c;但是截至到目前最新版本&#xff08;Jenkins v2.298&#xff0c;Performance&#xff1a;v3.19&#xff09;&#xff0c;此插件和Jenkins都存在有兼容性问题&#xf…...

帷幄内容管理系统:从立人设、做内容到定向投流,品牌 KOS 体系打造「百万导购」

随着公域流量越来越贵&#xff0c;获客成本越来越高&#xff0c;品牌们已经越来越不满足于高曝光&#xff0c;而是更多地关注起销售转化率。继 KOL、KOC&#xff08;关键意见消费者&#xff09; 之后&#xff0c;KOS&#xff08;关键意见销售&#xff09;营销模式走入品牌的视野…...

Windows 11 任务栏透明美化神器:TranslucentTB 完全使用指南

Windows 11 任务栏透明美化神器&#xff1a;TranslucentTB 完全使用指南 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 想要让 Windows …...

STM32G473 IAP实战:基于CAN/USART双通道的BootLoader设计与固件升级全流程解析

1. 为什么需要双通道IAP方案 在工业现场设备维护中&#xff0c;固件升级是个高频刚需。想象一下车间里有上百台设备需要更新程序&#xff0c;如果每台都要拆机接下载器&#xff0c;工程师怕是会当场崩溃。我去年参与的一个AGV调度项目就吃过这个亏&#xff0c;后来我们给STM32…...

SEO_详解SEO优化的基本原理与核心策略介绍

<h2>SEO优化的基本原理&#xff1a;为什么SEO对网站流量至关重要</h2> <p>SEO优化&#xff0c;即搜索引擎优化&#xff0c;是指通过优化网站结构、内容和外部链接等多个方面&#xff0c;提高网站在搜索引擎结果页面上的排名&#xff0c;从而吸引更多自然流量…...

交叉调整率差的5大根源—变压器、绕组、反馈、拓扑、元件

Q1&#xff1a;导致交叉调整率差的第一大根源是什么&#xff1f;变压器漏感与绕组耦合不良。漏感使能量不能完全传递到辅路&#xff0c;各绕组漏感不一致&#xff0c;负载变化时电压漂移更明显。耦合系数越接近 1&#xff0c;交叉调整率越好。Q2&#xff1a;绕组绕制方式对交叉…...

TikTok GMXMAX广告优化全攻略

在2026年&#xff0c;TikTok广告投放逐渐向自动化模型演进&#xff0c;其中GMX MAX&#xff08;GMV Max&#xff09;成为很多团队用来提升ROI和放量的重要方式。相比传统广告模式&#xff0c;它可以自动完成受众匹配与预算分配&#xff0c;减少大量人工干预。不过在实际操作中&…...

Realistic Vision V5.1本地AI摄影方案:支持HDR合成与多曝光融合预处理

Realistic Vision V5.1本地AI摄影方案&#xff1a;支持HDR合成与多曝光融合预处理 1. 项目概述 Realistic Vision V5.1虚拟摄影棚是一款基于Stable Diffusion 1.5生态顶级写实模型开发的本地化AI摄影工具。它通过深度优化模型参数和显存管理&#xff0c;让普通用户无需专业摄…...

Torch-Pruning支持神经辐射场(NERF):3D重建模型压缩终极指南

Torch-Pruning支持神经辐射场(NERF)&#xff1a;3D重建模型压缩终极指南 【免费下载链接】Torch-Pruning [CVPR 2023] Towards Any Structural Pruning; LLMs / Diffusion / Transformers / YOLOv8 / CNNs 项目地址: https://gitcode.com/gh_mirrors/to/Torch-Pruning 神…...

【模型手术室】第九篇:多模态微调 —— 让模型学会“看图说话”:从像素到行业认知的飞跃

专栏进度&#xff1a;09 / 10 (微调实战专题) 如果你使用的是 LLaVA、Qwen2-VL 或 DeepSeek-VL&#xff0c;它们原生具备识别猫狗和常识图片的能力。但如果你给它一张半导体无尘车间的传感器拓扑图&#xff0c;它大概率会胡言乱语。多模态微调的目标&#xff0c;就是建立“视觉…...

因果模型评估完全手册:Python指标与验证方法详解

因果模型评估完全手册&#xff1a;Python指标与验证方法详解 【免费下载链接】python-causality-handbook 项目地址: https://gitcode.com/gh_mirrors/py/python-causality-handbook 在数据分析和决策科学领域&#xff0c;因果推断模型的评估是确保模型可靠性与实用性的…...

突破微信设备限制:WeChatPad如何实现免Root双设备同时在线

突破微信设备限制&#xff1a;WeChatPad如何实现免Root双设备同时在线 【免费下载链接】WeChatPad 强制使用微信平板模式 项目地址: https://gitcode.com/gh_mirrors/we/WeChatPad 你是否曾因微信只能单设备登录而错失重要消息&#xff1f;是否渴望在手机和平板上同时接…...