HashSet介绍

(1) 为啥要用HahSet?
假如我们现在想要在一大堆数据中查找X数据。LinkedList的数据结构就不说了,查找效率低的可怕。ArrayList哪,如果我们不知道X的位置序号,还是一样要全部遍历一次直到查到结果,效率一样可怕。HashSet天生就是为了提高查找效率的。

(2) hashCode 散列码
散列码是由对象导出的一个整数值。在Object中有一个hashCode方法来得到散列码。基本上,每一个对象都有一个默认的散列码,其值就是对象的内存地址。但也有一些对象的散列码不同,比如String对象,它的散列码是对内容的计算结果:

Java代码

//String对象的散列码计算
String str="hello";
int hash=0;
for(int i=0;i<length();i++)
hash=31*hash+charAt(i);

那么下面散列码的结果不同也就好解释了。s和t都还是String对象,散列码由内容获得,结果一样。sb和tb是StringBuffer对象,自身没有hashCode方法,只能继承Object的默认方法,散列码是对象地址,当然不一样了。

Java代码

String s=new String("OK");//散列码: 3030
String t="Ok"; /散列码: 3030
StringBuffer sb=new StringBuffer(s); //散列码:20526976
StringBuffer tb=new StringBuffer(t); //散列码:20527144


(3)HashSet 散列表的内部结构
HashSet是个链表数组。每一个数组元素就是一个列表,我们称为散列表元 。

(4)HashSet 如何add机制
假如我们有一个数据(散列码76268),而此时的HashSet有128个散列单元,那么这个数据将有可能插入到数组的第108个链表中(76268%128=108)。但这只是有可能,如果在第108号链表中发现有一个老数据与新数据equals()=true的话,这个新数据将被视为已经加入,而不再重复丢入链表。 那么数据的散列码我知道,但HashSet的散列单元大小如何指定那?
Java默认的散列单元大小全部都是2的幂,初始值为16(2的4次幂)。假如16条链表中的75%链接有数据的时候,则认为加载因子达到默认的0.75。HahSet开始重新散列,也就是将原来的散列结构全部抛弃,重新开辟一个散列单元大小为32(2的5次幂)的散列结果,并重新计算各个数据的存储位置。以此类推下去.....

(5)为什么HashSet查找效率提高了。
知道了HashSet的add机制后,查找的道理一样。直接根据数据的散列码和散列表的数组大小计算除余后,就得到了所在数组的位置,然后再查找链表中是否有这个数据即可。
查找的代价也就是在链表中,但是真正一条链表中的数据很少,有的甚至没有。几乎没有什么迭代的代价可言了。所以散列表的查找效率建立在散列单元所指向的链表中的数据要少 。

(6) hashCode方法必须与equals方法必须兼容
如果我们自己定义了一个类,想对这个类的大量对象组织成散列表结构便于查找。有一点一定要注意:就是hashCode方法必须与equals方法相兼容。

Java代码

//hashCode与equals方法的兼容
public class Employee{
public int id;
public String name="";
//相同id对象具有相同散列码
public int hashCode(){
return id;
}
//equals必须比较id
public boolean equals(Employee x){
if(this.id==x.id) return true;
else return false;
}
}

为什么要这样,因为HashSet不允许相同元素(equals==ture)同时存在在结构中。假如employeeX(1111,“张三”)和employee(1111,"李四"),而Employee.equals比较的是name。这样的话,employeeX和employeeY的equals不相等。它们会根据相同的散列码1111加入到同一个散列单元所指向的列表中。这种情况多了,链表的数据将很庞大,散列冲突将非常严重,查找效率会大幅度的降低。
(6) 总结一下
1、HashSet不能重复存储equals相同的数据 。原因就是equals相同,数据的散列码也就相同(hashCode必须和equals兼容)。大量相同的数据将存放在同一个散列单元所指向的链表中,造成严重的散列冲突,对查找效率是灾难性的。

2、HashSet的存储是无序的 ,没有前后关系,他并不是线性结构的集合。

3、hashCode必须和equals必须兼容, 这也是为了第1点。
1. 迈进 SAP UI5 开发世界的第一步 - Hello World SAP UI5 是一个用于开发企业级 Web 应用的前端框架,基于 HTML 和 JavaScript. 作为教程的第一步,我们需要了解最基础的 HTML 知识。 请大家在电脑上任意新建一个文件夹,将其命名,比如我取的名称为 Walkthrough. 进入 Walkthrough 文件夹,再新建一个文件夹名叫 01,代表本教程的第一个步骤。 进入 01 文件夹,新建一个 webapp 文件夹。这个名称是 web 应用约定俗成所使用的,大家都倾向于用这个名称,当然你要是想用其他名称也没有问题。...... 阅读详情

相关推荐

基于IC动态加权的机器学习多因子选股策略:从模型融合到实战回测

在量化投资领域,多因子选股模型通过挖掘市场数据中的有效信号来预测股票收益。其核心原理在于利用统计学与机器学习算法,从海量因子中识别出与未来收益具有稳定相关性的特征。这一技术的核心价值在于将主观投资决策转化为系统化、可重复的客观过程,从而在控制风险的前提下追求超额收益。其典型应用场景包括股票阿尔法策略构建、Smart Beta产品设计以及资产配置中的股票筛选环节。本文聚焦于如何通过信息系数(IC)这一关键指标,动态融合Ridge回归、MLP神经网络和随机森林等多个预测模型,构建一个能够自适应市场风格轮动的选股

weixin_34216614的博客 451

set详解

是Collection的子接口,存储无序的,不可重复的数据,使用的都是Collection中定义的方法 特点:(以HashSet为例说明) 1.无序性:不等于随机性,它的的底层数据结构虽然是数组但是存储的数据在底层数组中并非按照数组索引的顺序添加,而是根据哈希值。 2.不可重复性:保证添加的元素按照equals()判断时,不能返回true,即:相同的元素只能添加一个。 它有三个实现类分别是 HashSet: LinkedHashSet: TreeSet: ...

weixin_42371679的博客 500

基于大模型的急性重症胰腺炎全流程预测与诊疗方案研究

本研究构建了基于大模型的急性重症胰腺炎(SAP)全流程预测与诊疗系统,实现了从术前风险评估到术后康复管理的精准诊疗闭环。通过整合临床信息、实验室检查和影像学等多源数据,模型在测试集上预测准确率达X%,AUC为X,显著优于传统评分系统。研究创新性地将预测结果应用于手术方案制定、麻醉决策、并发症防控及个性化护理,形成智能化诊疗方案。验证结果显示模型具有良好的稳定性和临床适用性,同时配套的健康教育体系提升了患者自我管理能力。尽管存在样本局限性和模型可解释性等不足,该研究为SAP的精准诊疗提供了新范式,未来可通过扩

嵌入式毕设/课设资料清单(速查手册·文档模板·题库,持续更新)→ 见最新文章 1115

Java语言:Java集合之HashSet查找和删除数据

目录 查找 删除 这里还是以宠物猫为例 总结一下HashSet中查找和删除数据的方法 查找 先说一下总体思路: 这里还是以宠物猫为例,(不是为了水文章,因为可能全部放在一起的话,一是自己不好查找知识点,另外还有就是放在一篇blog中显得过于冗长) 在HashSet中存储了宠物猫的信息 查找需要进行查询操作的宠物猫信息 查找的方式:第一种,通过对象名查找 不过谁能知道对象名啊!一般都是使用宠物猫的名字进行查找 所以第二种就是通过宠物猫的名字进行查找 ...

日出印象 7842

【逆强化学习-1】学徒学习(Apprenticeship Learning)

逆强化学习算法1:学徒学习。算法原理+算法步骤+代码+仿真:一个基于gym的小车上山的仿真。附赠学徒学习+Q-Table及学徒学习+DQN的全套代码。

体会编程语言独到的美 7493

CSP-J 入门级第一轮认证 2025 详细解析

2025年CSP-J入门级第一轮认证模拟赛提供10套免费试题,含选择题与解析。选择题涉及计算机科学基础,如32位无符号整数最大值计算(约42.9亿,选A)、C++位运算(255&254=254,选B)、递归函数分析(calc(5)=6,选B)、哈夫曼树构造(带权路径长度186,选B)等。其他题目涵盖图论(有向图边数等于入度/出度和,选B)、组合数学(120种选法,选C)、布尔逻辑(选项C不恒等)、模运算周期性(f[2025]=6,选D)、C++字符串特性(支持string+char,选B)及引用传参

lan_in的博客 2939

Set集合

Set集合 Set集合与Collection基本上完全一样,它没有提供任何额外的方法。实际上Set就是Collection,只是行为略有不同(Set不允许包含重复元素)。 Set集合不允许包含相同的元素,如果试图把两个相同的元素加入同一个Set集合中,则添加操作失败,add方法返回false,且新元素不会被加入。 Set判断两个对象相同不是使用==运算符,而是根据equals方法。 public class SetTest { public static void main(String[] ar

xy87940020的博客 1万+

Silly Tavern(酒馆)AI 角色扮演下载与安装教程(Windows本地部署)

SillyTavern是一款开源AI角色扮演前端工具,支持沉浸式对话和长期角色互动。本文详细介绍了在Windows系统F盘部署SillyTavern的完整流程,包括下载项目、安装Node.js和Git环境、配置路径、启动服务等关键步骤,并特别说明非系统盘路径可能遇到的npm安装问题及解决方法。成功启动后,用户可通过浏览器访问本地地址使用该工具进行AI角色扮演互动。

Tan3851的博客 1万+

set的常见用法详解

目录set的定义set容器内元素的访问 set翻译为集合,是一个内部自动有序且不含重复元素的容器。在考试中,有可能出现需要去掉重复元素的情况,而且有可能因这些元素比较大或者类型不是int型而不能直接开散列表,在这种情况下就可以用set来保留元素本身而不考虑它的个数。当然,上面说的情况也可以通过再开一个数组进行下标和元素的对应来解决,但是set提供了更为直观的接口,并且加入set之后可以实现自动排序,因此熟练使用set可以在做某些题时减少思维量。 需要的头文件: #include<set>

辉小歌的博客 2万+

CKA-CN考试之路----2

部分知道就可以了,考试不用输入,后面不再复述.这里我们需要将两端内容凭借成1个yaml。执行题目中给的的命令进行测试。

Q先生 242

离散小波变换(概念与应用)

离散小波变换(概念与应用)

weixin_46713695的博客 4415

set结构详解(案例)

Set函数可以接受一个数组(或类似数组的对象)作为参数,用来初始化// 6咱们就是说,创建一个Set 并且输出s1和s1.size(长度),发现了什么?发现set去重了,也就是说明了set中成员的值都是唯一的,可以利用此性质完成数组去重的操作.2.遍历Set(使用for of )...............

Adoins_yang的博客 804

人工智能数据治理——解读AI时代数据治理白皮书 2025【附全文阅读】

摘要:该白皮书面向企业数字化负责人及AI项目推进人员,探讨AI时代数据治理的战略升级。提出"好数据+好数据知识"双基石理念,强调数据需满足"三高"标准(高精度、一致性、时效性)并构建语义知识库。构建四层治理框架,包括数据采集处理、合规安全、知识库建设及质量改进,并介绍AI赋能治理的新范式,如智能ETL和治理Agent体系。同时分析"软件+AI+好数据"的应用模式,为企业实现智能数据治理提供实践指导。(149字)

cdfunlove的博客 633

Java HashSet 介绍

因为HashSet底层还是使用的数组来进行数据存储的,在取数据的时候,它是从小标为0的数组位置依次进行取数据而我们在存数据的时候,我们是通过计算出的Hash值来判断具体存在那个下标位置的所以导致我们先存的数据可能存储的下标位置在后面,然后就导致HashSet是无序的和HashSet的不同之处---LinkedHashSet在做取的时候,得到的属于是有序的。

HUAIJIUdada的博客 1118

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

HashSet集合介绍

Set接口 java.util.Set接口和java.util.List接口一样,同样继承自Collection接口,它与Collection接口中的方法基本一致,并没有对Collection接口进行功能上的扩充,只是比Collection接口更加严格了。与List接口不同的是,Set接口中元素无序,并且都会以某种规则保证存入的元素不出现重复。 Set集合有多个子类,这里我们介绍其中的java...

Leon_Jinhai_Sun的博客 463

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Java HashSet详细介绍

目录第1部分 HashSet介绍第2部分 HashSet数据结构第3部分 HashSet源码解析(基于JDK1.6.0_45)第4部分 HashSet遍历方式4.1 通过Iterator遍历HashSet4.2 通过for-each遍历HashSet第5部分 HashSet示例 第1部分 HashSet介绍 HashSet 简介 HashSet 是一个没有重复元素的集合。 它是由HashMap实现...

忘尘的博客 804

HashSet 介绍

HashSet 介绍 标签: java8源码 思路:内部就是用HashMap来存储数据.把set的值存放在map的key中.Haset 可以简单的理解为 HashMap 的key的集合. 因为其,依靠HashMap来完成各种操作. 特点 1.允许使用null,最多一个 2.不保正元素顺序 3.非同步的 4.Iterator会触发快速失败机制 签名 public c...

伍马 538

java的HashSet的介绍

public class HashSetextends AbstractSetimplements Set, Cloneable, Serializable 构造方法摘要 HashSet() 构造一个新的空集合,其底层 HashMap 实例的默认初始容量是 16,加载因子是 0.75。 HashSet(Collection<? extends E> c)

红豆和绿豆的博客 462

hashset java api_Java HashSet详细介绍

第1部分 HashSet介绍HashSet 简介HashSet 是一个没有重复元素的集合。它是由HashMap实现的,不保证元素的顺序,而且HashSet允许使用 null 元素。HashSet是非同步的。如果多个线程同时访问一个HashSet,而其中至少一个线程修改了该 set,那么它必须 保持外部同步。这通常是通过对自然封装该 set 的对象执行同步操作来完成的。如果不存在这样的对象,则应该使...

weixin_34622572的博客 449

HashSet简单介绍

HashSet集合 [字体: ] java.lang.Object    |_ java.util.AbstractCollection         |_ java.util.AbstractSet               |_ java.util.HashSet HashSet中不允许有重复的元素。例如: Set hashSet = new HashSet();

jia4525036的专栏 972

HashSet实现方法介绍

一、HashSet 本专栏的文章超详细的逐句介绍Java高级接口之HashSet底层源码讲解(二)主要介绍了HashSet的源码,下面我将介绍HashSet的实现方法。 二、实现方法 实现方法 功能 boolean add(E e) 如果没有已存在,则将指定的元素添加到该集合中。 void clear() 从这个集合中移除所有的元素。 Object clone() 返回该 HashSet实例浅拷贝:元素本身不是克隆。 boolean contains(Object o) 如果这套

m0_43405302的博客 707

【JAVASE】HashSet的基础介绍

package Gather.CollectionArrayList.HashSet; import java.util.HashSet; /** * @author 小王宝友 * @version 3.89 * HashSet实现了Set接口 * HashSet实际上是HashMap * 可以存放null,但只能有一个null * HashSet不保证元素是有序的,取决于hash后, * 再确定索引的结果(不保证存放元素和取出元素顺序一致) * 不能有重复元素或是对象y */ @.

ASW262623的博客 146
上一篇: java基数排序
下一篇: java方法参数是引用调用还是值调用
lk231_java
博客等级 码龄15年 0粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值