深入理解Java HashSet类及其实现原理

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云;欢迎大家常来逛逛

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

前言

  在Java开发中,集合框架是非常重要的一部分,集合框架为Java提供了一种方式来管理和组织数据。其中HashSet是集合框架中的一种重要实现方式,它提供了一种存储集合元素的无序且唯一的方式。

摘要

  本文将介绍HashSet的基本概念,功能特点,使用方法,以及优缺点分析和应用场景案例。通过本文的学习,读者将会具备使用HashSet的能力,同时了解HashSet的优势和限制。

HashSet

简介

  HashSet是Java集合框架中的一种Set接口的实现。与List集合不同,Set集合中没有重复元素,HashSet提供了一种高效的无序存储方式,可以存储不同类型的数据,包括数字,字符串,对象和集合等。

  HashSet使用哈希表作为存储数据的方式,底层实现是HashMap,每个元素在HashSet中都有一个对应的Key和Value。当添加一个元素到HashSet中时,HashSet会根据元素的hashCode()方法值计算出对应的Key,再将元素加入到HashMap中。如果已存在相同Key的元素则会被覆盖,因此HashSet中不会存在重复元素。

  HashSet的基本操作包括添加元素、删除元素、判断元素是否存在、遍历元素等。

源代码解析

以下是HashSet的源代码解析:

public class HashSet<E> extends AbstractSet<E>implements Set<E>, Cloneable, Serializable
{// 底层实现为HashMapprivate transient HashMap<E,Object> map;// Dummy value to associate with an Object in the backing Mapprivate static final Object PRESENT = new Object();// 构造函数public HashSet() {map = new HashMap<>();}public boolean add(E e) {return map.put(e, PRESENT)==null;}public boolean remove(Object o) {return map.remove(o)==PRESENT;}public boolean contains(Object o) {return map.containsKey(o);}public void clear() {map.clear();}public int size() {return map.size();}public Iterator<E> iterator() {return map.keySet().iterator();}public Object clone() {try {HashSet<E> newSet = (HashSet<E>)super.clone();newSet.map = (HashMap<E,Object>)map.clone();return newSet;} catch (CloneNotSupportedException e) {throw new InternalError(e);}}private void writeObject(ObjectOutputStream s)throws IOException {s.defaultWriteObject();s.writeInt(map.capacity());s.writeFloat(map.loadFactor());s.writeInt(map.size());for (E e : map.keySet())s.writeObject(e);}private void readObject(ObjectInputStream s)throws IOException, ClassNotFoundException {s.defaultReadObject();int capacity = s.readInt();if (capacity < 0) {throw new InvalidObjectException("Illegal capacity: " +capacity);}float loadFactor = s.readFloat();if (loadFactor <= 0 || Float.isNaN(loadFactor)) {throw new InvalidObjectException("Illegal load factor: " +loadFactor);}int size = s.readInt();if (size < 0) {throw new InvalidObjectException("Illegal size: " +size);}map = new HashMap<>(capacity, loadFactor);for (int i=0; i<size; i++) {E e = (E) s.readObject();map.put(e, PRESENT);}}
}

如下是部分源码截图:

在这里插入图片描述

应用场景案例

HashSet的应用场景比较广泛,例如:

  • 数据去重:通过将数据存储在HashSet中,可以快速去除重复的数据。
  • 缓存管理:可以使用HashSet来存储缓存对象,以提高缓存查找效率。
  • 数据去重:通过将数据存储在HashSet中,可以快速去除重复的数据。

优缺点分析

HashSet的优点有:

  • 存储快速:HashSet使用哈希表作为底层存储结构,可以快速存储和查找元素。
  • 去重:HashSet中不会存在重复元素,可以用于数据去重。
  • 线程不安全:HashSet是线程不安全的,不适合在多线程环境中使用。

HashSet的缺点有:

  • 无序性:HashSet中的元素是无序的,不能按照特定的顺序进行操作。

类代码方法介绍

以下是HashSet类的常用方法介绍:

  • add(E e):将元素添加到HashSet中。
  • remove(Object o):将元素从HashSet中删除。
  • contains(Object o):判断元素是否存在于HashSet中。
  • clear():清空HashSet中的所有元素。
  • size():返回HashSet中元素的数量。
  • iterator():返回一个迭代器,可以遍历HashSet中的所有元素。

测试用例

以下是使用HashSet的测试用例:

测试代码演示

package com.example.javase.collection;import java.util.HashSet;/*** @Author ms* @Date 2023-10-21 21:05*/
public class HashSetTest {public static void main(String[] args) {HashSet<String> set = new HashSet<>();System.out.println(set.add("Hello"));System.out.println(set.add("World"));System.out.println(set.add("Hello"));System.out.println(set.remove("Hello"));System.out.println(set.remove("Hello"));System.out.println(set.contains("Hello"));System.out.println(set.contains("World"));set.clear();System.out.println(set.size());set.add("Hello");set.add("World");System.out.println(set.size());StringBuilder sb = new StringBuilder();for (String s : set) {sb.append(s);}System.out.println(sb.toString());}
}

测试结果

  根据如上测试用例,本地测试结果如下,仅供参考,你们也可以自行修改测试用例或者添加更多的测试数据或测试方法,进行熟练学习以此加深理解。

在这里插入图片描述

测试代码分析

该代码演示了 HashSet 的基本用法。

  首先在 main 方法中创建一个空的 HashSet 对象 set,并向其中添加两个字符串 “Hello” 和 “World”。添加第一个元素 “Hello” 时返回 true,添加第二个元素 “World” 时返回 true,再添加第一个元素 “Hello” 时返回 false,因为 HashSet 不允许添加重复元素。

  接着,使用 remove 方法尝试删除元素 “Hello”,第一次删除成功并返回 true,第二次删除失败并返回 false,因为元素 “Hello” 已经被删除了。

  contains 方法用来判断元素是否存在于 HashSet 中,第一次查询元素 “Hello” 时返回 false,因为元素已经被删除,第二次查询元素 “World” 时返回 true,因为元素仍然存在。

  clear 方法将 HashSet 中的所有元素清空,使其变为空集合,因此调用 set.size() 方法返回 0。

  set.add 方法可以用于添加元素,再次添加元素 “Hello” 和 “World” 之后调用 set.size() 方法返回 2。

  最后使用 for-each 循环遍历 HashSet 中的元素,将每个元素拼接在一起后输出。因为 HashSet 是无序的,因此输出的字符串也是无序的。

全文小结

  本文介绍了HashSet的基本概念,功能特点,使用方法,以及优缺点分析和应用场景案例。HashSet是Java集合框架中的一种重要实现方式,提供了一种高效的无序存储方式,可以用于数据去重、缓存管理等场景。同时,HashSet是线程不安全的,需要注意使用。

总结

  HashSet是Java集合框架中的一种重要实现方式,具有存储快速、去重等优点,同时也存在一些缺点,例如无序性和线程不安全性。在实际的开发中,需要充分考虑应用场景和需求,选择合适的集合实现方式。

… …

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

… …

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。

⭐️若有疑问,就请评论留言告诉我叭。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3030396.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

伦敦金交易常识 原来可以这样分类

如果投资者想做好伦敦金交易&#xff0c;对市场中的伦敦金交易常识等等都需要加以学习和研究&#xff0c;别小看那些伦敦金交易常识&#xff0c;很多高深的交易策略也是从常识出发慢慢建立起来的。伦敦金交易常识可以分为几类&#xff0c;下面我们就来讨论一下。 伦敦金市场的基…

OpenNJet,够轻更强云原生应用引擎

前言&#xff1a; 在正式介绍OpenNJet之前&#xff0c;我们先来看看它的技术架构&#xff0c;如下图所示&#xff0c;OpenNJet正是NGINX的Pro版&#xff0c;在100%兼容NGINX基础上&#xff0c;新增了动态配置加载、主动式健康检测、集群高可用、声明式API等多种强大功能。 NGIN…

FLEX组件可视化设计器CSS3代码生成器

Flex布局可以简便、完整、响应式地实现各种页面布局&#xff0c;所以本软件研发出来FLEX组件。Flex组件是本软件布局的核心&#xff0c;只有掌握好flex组件布局&#xff0c;你才能打造出优秀的个性化页面。 设计完成后整个布局及CSS样式代码都会生成。 排列方向flex-direction…

GPT+Python近红外光谱数据分析

原文链接&#xff1a;GPTPython近红外光谱数据分析https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247603913&idx1&sn6eb8fd6f1abcdd8160815997a13eb03d&chksmfa82172ecdf59e389a860547a238bb86c7f38ae3baa14e97c7490a52ef2a2c206f88d503a5eb&token…

《星河战队4:星际觉醒》(上)AI科幻电影欣赏

《星河战队4&#xff1a;星际觉醒》&#xff08;上&#xff09;AI科幻电影欣赏 征服与荣耀&#xff0c;贪婪与救赎&#xff0c;浩瀚宇宙&#xff0c;人类终将灭绝&#xff1f; 《星河战队4&#xff1a;星际觉醒》&#xff08;上&#xff09;在未来世界&#xff0c;随着星际探索…

使用LangChain和Neo4j快速创建RAG应用

大家好&#xff0c;Neo4j 通过集成原生的向量搜索功能&#xff0c;增强了其对检索增强生成&#xff08;RAG&#xff09;应用的支持&#xff0c;这标志着一个重要的里程碑。这项新功能通过向量索引搜索处理非结构化文本&#xff0c;增强了 Neo4j 在存储和分析结构化数据方面的现…

Zabbix监控中文乱码问题解决方法

一、问题描述 1.查看Zabbix仪表盘 在Zabbix的监控仪表盘界面&#xff0c;字体显示为“方框”&#xff0c;无法查看到具体的性能指标名称。 2.问题分析 Zabbix的web端没有中文字库&#xff0c;导致切换到中文页面&#xff0c;中文成了乱码这个问题&#xff0c;我们最需要把中文…

Vue2 组件通信方式

props/emit props 作用&#xff1a;父组件通过 props 向子组件传递数据parent.vue <template><div><Son :msg"msg" :pfn"pFn"></Son></div> </template><script> import Son from ./son export default {name: …

RAG 场景对Milvus Cloud向量数据库的需求

虽然向量数据库成为了检索的重要方式,但随着 RAG 应用的深入以及人们对高质量回答的需求,检索引擎依旧面临着诸多挑战。这里以一个最基础的 RAG 构建流程为例:检索器的组成包括了语料的预处理如切分、数据清洗、embedding 入库等,然后是索引的构建和管理,最后是通过 vecto…

【计算机毕业设计】springboot河北任丘非物质文化遗产数字化传承

当今社会进入了科技进步、经济社会快速发展的新时代。国际信息和学术交流也不断加强&#xff0c; 计算机技术对经济社会发展和人民生活改善的影响也日益突出&#xff0c;人类的生存和思考方式也产生了变化。传统购物方式采取了人工的管理方法&#xff0c;但这种管理方法存在着许…

第二章 项目定义

七大项目定义基本问题&#xff1a; 为什么要做这些&#xff1f;&#xff08;意图&#xff09;当前项目要支持什么组织目标&#xff1f;&#xff08;目标和宗旨&#xff09;当前项目如何与其他正在进行的项目保持协调一致&#xff1f;&#xff08;项目范围、项目背景、项目依赖…

TCP超时重传机制

一、TCP超时重传机制简介 TCP超时重传机制是指当发送端发送数据后&#xff0c;如果在一定时间内未收到接收端的确认应答&#xff0c;则会认为数据丢失或损坏&#xff0c;从而触发重传机制。发送端会重新发送数据&#xff0c;并等待确认应答。如果在多次重传后仍未收到确认应答&…

三级综合医院微信预约挂号系统源码,PC后台管理端+微信公众号+支付宝小程序全套源码

智慧医院预约挂号系统&#xff0c;微信医疗预约挂号小程序源码&#xff0c;实体医院预约挂号支付系统源码 本系统主要面向中大型的医疗机构&#xff0c;适用于各级公立和民营医院&#xff0c;可对接院内his、lis、pacs系统。 PC后台管理端微信公众号支付宝小程序 系统支持当日…

智慧互联,统信UOS V20桌面专业版(1070)解锁办公新模式丨年度更新

从小屏到大屏 突破&#xff0c;就在方寸之间 从人机到智脑 融合&#xff0c;旨在新质生产力 统信UOS一直致力于将先进科技与用户场景相结合&#xff0c;不断提升用户的工作效率和生产力。在最新发布的统信UOS V20桌面专业版&#xff08;1070&#xff09;版本中&#xff0c;我们…

【stm32-5】输入捕获模式测频率PWMI模式测频率占空比

1.输入捕获模式测频率 &#xff08;1&#xff09;main.c #include "Device/Include/stm32f10x.h" // Device header #include "pwm.h" #include "delay.h" #include "OLED.h" #include "IC.h" uint8_t i; int main(void…

HTML【安装HBuilder、常用标签】--学习JavaEE的day44

day44 JavaEE 学习过程&#xff1a;前端—>数据库—>服务器端 前端的VUE在框架阶段学习 JavaEE学习过程图 HTML 前端&#xff1a;展示页面、与用户交互 — HTML 后端&#xff1a;数据的交互和传递 — JavaEE/JavaWeb 1. 前端开发的工作模式 开发输出htmlcssjs 理解&am…

mac安装禅道

前提已安装&#xff1a;phpapacheMySQL mac安装 php7.1/apache-CSDN博客 安装MySQL 一、禅道下载 安装官方文档 源码包下载地址&#xff1a;禅道下载 - 禅道开源项目管理软件 。 1. 解压禅道源码包 2. 将解压后的文件复制到Apache访问目录下 &#xff08;默认路径为 /Libra…

等保2.0|定级、备案、整改、测评流程

从个人数据泄露&#xff0c;到企业遭到黑客攻击&#xff0c;网络安全风险已经越发严重。随着互联网的不断发展&#xff0c;数字化经济的普及&#xff0c;信息安全等级保护既是行业标准&#xff0c;又是国家要求。如果企业不做等保&#xff0c;轻则罚款、重则停业。 我国等级保…

全方位清理Mac电脑内存必备软件工具CleanMyMac

对于很多职场朋友来说&#xff0c;一台mac电脑上标配&#xff0c;它的高效性能与优秀的交互体验总能让工作变得更加得心应手&#xff0c;但有时候也会发现&#xff0c;随着时间的推移&#xff0c;Mac运行变得缓慢&#xff0c;处理工作不似最开始的丝滑&#xff0c;那这可能是因…

HashSet扩容机制

HashSet底层是HashMap,第一次添加的时候,table数组扩容到16,临界值是16*加载因子(默认是0.75),到达临界值进行扩容。 HashSet<Integer> hashSet = new HashSet<>();hashSet.add(5);hashSet.add(2);hashSet.add(5);hashSet.add(8);hashSet.add(1);当new一个H…