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

Java HashSet 介绍

怀旧网个人博客网站地址:怀旧网,博客详情:Java HashSet 介绍

哈希值介绍

创建一个实体类

public class Student {private String name;private int age;public Student(String name, int age) {this.name = name;this.age = age;}
}

使用测试

public static void main(String[] args) {Student s1 = new Student("zhangsan", 12);Student s2 = new Student("zhangsan", 12);System.out.println(s1.hashCode());System.out.println(s2.hashCode());
}

image-20240315164034665

  • 打印结果不同

重写hashCode 和 equals方法后

@Override
public 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 && Objects.equals(name, student.name);
}@Override
public int hashCode() {return Objects.hash(name, age);
}

image-20240315164150805

  • 运行结果相同--自定义类型对象,因为在没有重写hashCode和equals方法前的哈希值是通过地址值来进行计算的。
System.out.println("123".hashCode());
System.out.println("123".hashCode());

image-20240315164415585

  • 测试自定义的String对象时,哈希值相同,说明它重写了hashCode和equals方法。

image-20240315164508997

注意事项:因为哈希值是采用int类型存储,所以哈希值是有限的数据,所以就有可能存在哈希冲突,如下例:

System.out.println("abc".hashCode());
System.out.println("acD".hashCode());

image-20240315194102152

HashSet 的底层原理

HashSet 的底层构成

image-20240315194824806

image-20240315195208196

注意事项:

  1. 默认情况下会 new 一个哈希表

image-20240315200305103

  1. 在HashMap中就是采用的内部定义的Node来存放每一个元素

    image-20240316145915007

  • 所以在HashSet中其实主要存的就是HashMap对象,像知道底层的原理,可以看后面的HashMap底层原理介绍。

  • 在调用HashSet的很多方法的时候,其实底层就是去掉了HashMap的方法。

image-20240316150215953

image-20240316150228763

HashSet 的元素添加过程

  1. 首先获取当前需要添加的元素的Hash值

  2. 然后判断当前需要存放的位置是否已经有元素了

  3. 要是没有元素,那就直接将当前添加的元素放到这个位置

  4. 要是有元素了,那就需要对当前存放的数据进行比较判断

  5. 当现在加入的元素在里面的时候,就直接不进行操作,返回false添加失败

  6. 当里面没有时

    • 在Jdk8以前是需要将当前的元素作为头节点,然后将后面的节点连接到当前的节点的下方
    • 在Jdk8及以后是直接将当前元素的尾节点位置,并且当当前的元素数量到达一个阈值后(链表的长度超过8,而且数组的长度大于等于64时),就会自动的将当前的链表转为一颗红黑树来进行存储,而Jdk8以前没有当前的这一步转成红黑树的操作。
  7. 成功将当前数据存储后直接返回true添加元素成功。

HashSet 的三个特点介绍

HashSet 无序的特点

  • 因为HashSet底层还是使用的数组来进行数据存储的,在取数据的时候,它是从小标为0的数组位置依次进行取数据
  • 而我们在存数据的时候,我们是通过计算出的Hash值来判断具体存在那个下标位置的
  • 所以导致我们先存的数据可能存储的下标位置在后面,然后就导致HashSet是无序的
public static void main(String[] args) {HashSet<String> set = new HashSet<>();set.add("123");set.add("456");set.add("444");System.out.println(set);
}

image-20240316151604324

HashSet 没有索引

  • 因为在底层存储的数据中,每一个下标位置存的是一串链表,或者是一颗红黑树,所以通过下标访问,就不能够有效的取出某一个数据

HashSet 的去重机制

  • 主要其实就是通过HashCode方法和equals方法来进行的
  • 当计算出添加的元素的Hash地址后就可以知道当前需要添加的元素需要存放的位置
  • 然后在通过equals方法来判断当前的元素值是否一样,要是也想通,那么就说明当前的数据重复,从而达到去重效果

扩展 LinkedHashSet 介绍

特点

  • 和HashSet的不同之处---LinkedHashSet在做取的时候,得到的属于是有序的。

有序的原理

  • 它是在底层的HashSet基础之上添加一个指针来记录当前添加进来的第一个元素,作为当前链表的头节点
  • 然后在第二个元素进来后,就会将第二个元素和第一个元素之间相互连接,并且第二个元素会被链表的尾指针指向
  • 在实际调用遍历方法的时候,和HashSet的区别就是,前者是遍历每一个列表元素,而LinkedHashSet是通过头指针,找到第一个元素,然后直接遍历整个链表来实现遍历的。

使用测试

public static void main(String[] args) {HashSet<String> set = new HashSet<>();set.add("123");set.add("456");set.add("444");System.out.println(set);
}		

image-20240316153002580

  • 使用HashSet的输出结果
public static void main(String[] args) {LinkedHashSet<String> set = new LinkedHashSet<>();set.add("123");set.add("456");set.add("444");System.out.println(set);
}

image-20240316153045042

  • 通过同样的例子,可以明显看出二者之间的区别

LinkedHashSet 总结

image-20240316153206583

使用场景

image-20240316153230510

相关文章:

Java HashSet 介绍

怀旧网个人博客网站地址&#xff1a;怀旧网&#xff0c;博客详情&#xff1a;Java HashSet 介绍 哈希值介绍 创建一个实体类 public class Student {private String name;private int age;public Student(String name, int age) {this.name name;this.age age;} }使用测试…...

2024年几款免费的AI对话工具介绍

目前几款免费的AI对话工具介绍 文章目录 目前几款免费的AI对话工具介绍一、前言二、AI对话工具介绍1、讯飞星火认知大模型2、百度文心一言3、通义千问4、豆包5、百川大模型6、智谱清言7、月子暗面-KIMI下面是国外的 AI 对话工具&#xff1a; 8、Replika8、Cleverbot9、Coze 三、…...

Gazebo构建模型(含GNSS、IMU、LiDAR、Camera传感器)

将GNSS、IMU、LiDAR、Camera传感器和机器人的base分别放在不同的文件中。这样可以提高模型的可维护性和模块化。下面是一个示例&#xff0c;展示如何将这些部分分别放在不同的.xacro文件中&#xff0c;然后通过导入的方式组合在一起。 1. 创建基础文件&#xff1a;my_robot.xa…...

#Js篇: 链式判断运算符 ?.和Null判断运算符 ??和逻辑赋值运算符||= = ??=

链式判断运算符 ?. ?.运算符&#xff0c;直接在链式调用的时候判断&#xff0c;左侧的对象是否为null或undefined。如果是的&#xff0c;就不再往下运算&#xff0c;而是返回undefined。 链判断运算符?.有三种写法。 obj?.prop // 对象属性是否存在 obj?.[expr] // 同上…...

IDEA敲Web前端快捷键

1.html基础格式 英文符号TAB键 <!doctype html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport"content"widthdevice-width, user-scalableno, initial-scale1.0, maximum-scale1.0, mini…...

【Vue3】【Naive UI】<NDropdown>标签

【Vue3】【Naive UI】 标签 基本设置自定义渲染交互事件其他属性 【VUE3】【Naive UI】&#xff1c;NCard&#xff1e; 标签 【VUE3】【Naive UI】&#xff1c;n-button&#xff1e; 标签 【VUE3】【Naive UI】&#xff1c;a&#xff1e; 标签 【VUE3】【Naive UI】&#xff1c…...

技术总结(四十一)

一、MySQL 索引概述 索引的概念&#xff1a;索引就好比一本书的目录&#xff0c;它能帮助 MySQL 快速定位到表中的数据行&#xff0c;而不用全表扫描。通过创建合适的索引&#xff0c;可以大大提高查询的效率。例如&#xff0c;在一个存储了大量员工信息的表中&#xff0c;如果…...

Android布局

一、线性布局 属性&#xff1a;orientation vertical horizontal layout_weight【水平均分&#xff0c;width"0dp"】 layout_height layout_width 小动物连连看 1<?xml version"1.0" encoding"utf-8"?>2<LinearLayout xmlns:and…...

k8s集成skywalking

如果能科学上网的话&#xff0c;安装应该不难&#xff0c;如果有问题可以给我留言 本篇文章我将给大家介绍“分布式链路追踪”的内容&#xff0c;对于目前大部分采用微服务架构的公司来说&#xff0c;分布式链路追踪都是必备的&#xff0c;无论它是传统微服务体系亦或是新一代…...

如何写一份优质技术文档

作者简介&#xff1a; 本文作者拥有区块链创新专利30&#xff0c;是元宇宙标准化工作组成员、香港web3标准工作组成员&#xff0c;参与编写《数据资产确权与交易安全评价标准》、《链接元宇宙&#xff1a;应用与实践》、《香港Web3.0标准化白皮书》等标准&#xff0c;下面提供…...

LeetCode:206.反转链表

跟着carl学算法&#xff0c;本系列博客仅做个人记录&#xff0c;建议大家都去看carl本人的博客&#xff0c;写的真的很好的&#xff01; 代码随想录 LeetCode&#xff1a;206.反转链表 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例…...

详解高斯消元

详解高斯消元 好东西,可以求所有一次方程组的解。 \color {red} 好东西,可以求所有一次方程组的解。 好东西,可以求所有一次方程组的解。 前置知识 一般消元法的公理: 两方程互换,解不变; 一方程乘以非零数 k k k,解不变; 一方程乘以数 k k k加上另一方程,解不变。 …...

Maven - 优雅的管理多模块应用的统一版本号

文章目录 概述一、使用 versions-maven-plugin 插件1. 在主 pom.xml 中定义插件2. 修改版本号3. 回退修改4. 提交修改 二、使用占位符统一管理版本号1. 在主 pom.xml 中定义占位符2. 使用 flatten-maven-plugin 插件自动替换占位符3. 修改版本号4. 为什么这种方式更方便&#x…...

国际网络安全趋势

1. 亲近拥抱人工智能自动化。 随着安全协调、人工智能自动化和响应(SOAR)的日益普及&#xff0c;人工智能自动化开始成为现实并将继续扩展到其他安全行动领域。寻求将人工智能自动化整合到原有的工具中&#xff0c;通过将威胁情报整合在一起&#xff0c;将其转换为可用格式并主…...

基于米尔全志T527开发板的FacenetPytorch人脸识别方案

本篇测评由优秀测评者“小火苗”提供。 本文将介绍基于米尔电子MYD-LT527开发板&#xff08;米尔基于全志 T527开发板&#xff09;的FacenetPytorch人脸识别方案测试。 一、facenet_pytorch算法实现人脸识别 深度神经网络 1.简介 Facenet-PyTorch 是一个基于 PyTorch 框架实…...

Altium Designer脚本工具定制

原理图设计自动化 ➡️Altium原理图检查工具 ➡️元器件参数集导入导出 ➡️原理图符号自动创建 ➡️原理图高级查找 ➡️原理图库文档高级查找 ➡️原理图文档对比 ➡️原理图库文档对比 PCB设计自动化 ➡️各种各样的PCB线圈自动创建 ➡️PCB文档导出成SVG格式文档…...

贝锐自研智慧网关系统OrayOS升级,适配Banana PI开发板BPI-R3 Mini

为了满足多元化的应用场景&#xff0c;贝锐与Banana PI携手合作&#xff0c;贝锐自研新一代云智慧网关系统OrayOS不仅已成功适配BPI-R3&#xff0c;还进一步扩展至BPI-R3 Mini&#xff0c;提供了更丰富的选择。在全球工业物联网、视频监控管理以及企业级办公存储等领域&#xf…...

搭建环境-PHP简介及环境搭建教程

搭建环境-PHP简介及环境搭建教程 前言 在现代Web开发中,PHP是一种广泛使用的服务器端脚本语言,它以简洁、高效和跨平台的特性受到开发者的青睐。无论是小型网站还是大型企业应用,PHP都能提供强大的支持。本文将为您详细介绍PHP的基本概念、特点,以及如何搭建PHP开发环境。…...

Maven 配置

参考学习&#xff1a; eclipse&#xff08;或myeclipse&#xff09;通过maven配置连接neo4j_eclipse 链接 neo4j-CSDN博客 爆肝十小时—我终于用Java连上Neo4j数据库 - 知乎 全站最全Maven下载安装配置教学&#xff08;2024更新...全版本&#xff09;建议收藏...赠送IDEA配置Ma…...

js常见函数实现

文章目录 一、数组Array1、forEach2、filter3、map4、reduce5、find6、findIndex7、includes8、join 二、对象Object1、Object.keys2、深复制 js环境中有很多工具函数&#xff0c;比如es6添加了很多新的属性和方法&#xff0c;这些方法也可以自定义实现&#xff0c;但是官方也提…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

关于uniapp展示PDF的解决方案

在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项&#xff1a; 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库&#xff1a; npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程

STM32F1 本教程使用零知标准板&#xff08;STM32F103RBT6&#xff09;通过I2C驱动ICM20948九轴传感器&#xff0c;实现姿态解算&#xff0c;并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化&#xff0c;适合嵌入式及物联网开发者。在基础驱动上新增…...

React从基础入门到高级实战:React 实战项目 - 项目五:微前端与模块化架构

React 实战项目&#xff1a;微前端与模块化架构 欢迎来到 React 开发教程专栏 的第 30 篇&#xff01;在前 29 篇文章中&#xff0c;我们从 React 的基础概念逐步深入到高级技巧&#xff0c;涵盖了组件设计、状态管理、路由配置、性能优化和企业级应用等核心内容。这一次&…...

基于Uniapp的HarmonyOS 5.0体育应用开发攻略

一、技术架构设计 1.混合开发框架选型 &#xff08;1&#xff09;使用Uniapp 3.8版本支持ArkTS编译 &#xff08;2&#xff09;通过uni-harmony插件调用原生能力 &#xff08;3&#xff09;分层架构设计&#xff1a; graph TDA[UI层] -->|Vue语法| B(Uniapp框架)B --&g…...

Axure零基础跟我学:展开与收回

亲爱的小伙伴,如有帮助请订阅专栏!跟着老师每课一练,系统学习Axure交互设计课程! Axure产品经理精品视频课https://edu.csdn.net/course/detail/40420 课程主题:Axure菜单展开与收回 课程视频:...

break 语句和 continue 语句

break语句和continue语句都具有跳转作用&#xff0c;可以让代码不按既有的顺序执行 break break语句用于跳出代码块或循环 1 2 3 4 5 6 for (var i 0; i < 5; i) { if (i 3){ break; } console.log(i); } continue continue语句用于立即终…...

LSTM-XGBoost多变量时序预测(Matlab完整源码和数据)

LSTM-XGBoost多变量时序预测&#xff08;Matlab完整源码和数据&#xff09; 目录 LSTM-XGBoost多变量时序预测&#xff08;Matlab完整源码和数据&#xff09;效果一览基本介绍程序设计参考资料 效果一览 基本介绍 普通的多变量时序已经用腻了&#xff0c;审稿人也看烦了&#…...

【Redis】Redis 的持久化策略

目录 一、RDB 定期备份 1.2 触发方式 1.2.1 手动触发 1.2.2.1 自动触发 RDB 持久化机制的场景 1.2.2.2 检查是否触发 1.2.2.3 线上运维配置 1.3 检索工具 1.4 RDB 备份实现原理 1.5 禁用 RDB 快照 1.6 RDB 优缺点分析 二、AOF 实时备份 2.1 配置文件解析 2.2 开启…...