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

【面试干货】 Java 中的 HashSet 底层实现

【面试干货】 Java 中的 HashSet 底层实现

  • 1、HashSet 的底层实现
  • 2、 HashSet 的特点
  • 3、 总结


💖The Begin💖点点关注,收藏不迷路💖

HashSet 是 Java 集合框架中的一个重要成员,它提供了不存储重复元素的集合。但是,你有没有好奇过 HashSet 是如何实现这一特性的呢?本文将带你深入了解 HashSet 的底层实现机制。

1、HashSet 的底层实现

HashSet 的实现是基于 HashMap 的。当我们创建一个 HashSet 对象时,实际上是在背后初始化了一个 HashMap 对象。

但是,HashSet 和 HashMap 的使用方式并不完全相同,这是因为 HashSet 隐藏了 HashMap 的某些复杂性,只暴露了简单的集合操作接口。

HashSet 不允许值重复,这是如何实现的呢? 关键在于 HashSet 是如何存储其元素的。在 HashSet 中,元素是作为 HashMap 的 key 存储的,而 HashMap 的 value 则是一个固定的对象(在 Java 8 及以后的版本中,这个固定的对象通常是一个名为 PRESENT 的静态常量对象)。

示例:

package com.mypackage;import java.util.HashMap;
import java.util.Map;public class MyHashSet<E> {// 使用 HashMap 存储元素,这里将 key 视为 HashSet 中的元素private Map<E, Object> map;// 静态常量,模拟 HashSet 中的 PRESENTprivate static final Object PRESENT = new Object();// 构造函数,初始化 HashMappublic MyHashSet() {map = new HashMap<>();}// 添加元素到 HashSet 中public boolean add(E e) {// 如果 put 方法返回 null,表示该 key 尚未在 HashMap 中存在return map.put(e, PRESENT) == null;}// 从 HashSet 中移除元素public boolean remove(E e) {// 如果 remove 方法返回 true,表示该 key 在 HashMap 中存在并且已被移除return map.remove(e) != null;}// 检查 HashSet 是否包含某个元素public boolean contains(E e) {// 如果 get 方法返回非 null 值,表示该 key 在 HashMap 中存在return map.containsKey(e);}// 为了展示 HashSet 的内容,我们提供一个简单的方法来打印它public void printSet() {for (E e : map.keySet()) {System.out.println(e);}}// 主函数,用于测试 MyHashSetpublic static void main(String[] args) {MyHashSet<String> myHashSet = new MyHashSet<>();myHashSet.add("apple");myHashSet.add("banana");myHashSet.add("apple"); // 这将不会添加,因为 "apple" 已经存在System.out.println(myHashSet.contains("apple")); // 输出:trueSystem.out.println(myHashSet.contains("orange")); // 输出:falsemyHashSet.remove("banana");myHashSet.printSet(); // 输出:apple}
}

在这里插入图片描述

2、 HashSet 的特点

  • 无序性:HashSet 不保证元素的迭代顺序与插入顺序相同。这是因为 HashSet 是基于 HashMap 实现的,而 HashMap 本身不保证映射的顺序。
  • 元素唯一性:HashSet 中的元素是唯一的,不允许重复。这是通过 HashMap 的 key 唯一性保证的。
  • 性能:HashSet 的查找、添加和删除操作的时间复杂度通常为 O(1),但在最坏的情况下可能会达到 O(n)(当哈希冲突严重,导致链表或红黑树过长时)。

3、 总结

HashSet 的底层实现是基于 HashMap 的,通过利用 HashMap 的 key 唯一性来保证集合中元素的唯一性。HashSet 隐藏了 HashMap 的复杂性,只提供了简单的集合操作接口,使得我们可以更加方便地使用它来处理不重复的元素集合。

在这里插入图片描述


💖The End💖点点关注,收藏不迷路💖

相关文章:

【面试干货】 Java 中的 HashSet 底层实现

【面试干货】 Java 中的 HashSet 底层实现 1、HashSet 的底层实现2、 HashSet 的特点3、 总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; HashSet 是 Java 集合框架中的一个重要成员&#xff0c;它提供了不存储重复元素的集合。但是&am…...

爬虫经典案例之爬取豆瓣电影Top250(方法二)

在上一篇文章的基础上&#xff0c;改进了代码质量&#xff0c;增加了多个正则表达式匹配&#xff0c;但同事也增加了程序执行的耗时。 from bs4 import BeautifulSoup import requests import time import re from random import randint import pandas as pdurl_list [https…...

如何优化React应用的性能?

优化React应用的性能是一个多方面的过程&#xff0c;涉及到代码的编写、组件的设计、资源的管理等多个层面。以下是一些常见的性能优化策略&#xff1a; 避免不必要的渲染: 使用React.memo、useMemo和useCallback来避免组件或其子组件不必要的重新渲染。 代码分割: 使用React.…...

css文字镂空加描边

css文字镂空加描边 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>文字镂空</title><style>/* 公用样式 */html,body{width: 100%;height: 100%;position: relative;}/* html{overflow-y: scroll;} */*{margi…...

python数据分析与可视化

Python 在数据分析和可视化方面有着广泛的应用,并且拥有众多强大的库和工具来支持这些任务。以下是一些常用的 Python 库和它们的主要用途: 数据分析 Pandas: Pandas 是 Python 中用于数据处理和分析的主要库。 它提供了数据框(DataFrame)和序列(Series)两种数据结构…...

webkit 的介绍

WebKit 是一个开源的网页浏览器引擎&#xff0c;它是 Safari 浏览器和许多其他应用程序的基础。WebKit 最初由苹果公司开发&#xff0c;并在2005年作为开源项目发布。WebKit 的核心组件包括 WebCore 和 JavaScriptCore。以下是 WebKit 的详细介绍&#xff1a; ### WebKit 的主…...

make与makefile

目录 一、make的默认目标文件与自动推导 二、不能连续make的原因 执行原理 touch .PHONY伪目标 make指令不回显 makefile多文件管理 简写依赖方法 三、回车与换行 四、缓冲区 一、make的默认目标文件与自动推导 假设这是一个makefile文件&#xff0c;make的时候默认生…...

深度神经网络一

文章目录 深度神经网络 (DNN)1. 概述2. 基本概念3. 网络结构 深度神经网络的层次结构详细讲解1. 输入层&#xff08;Input Layer&#xff09;2. 隐藏层&#xff08;Hidden Layers&#xff09;3. 输出层&#xff08;Output Layer&#xff09;整体流程深度神经网络的优点深度神经…...

Pnpm:包管理的新星,如何颠覆 Npm 和 Yarn

在探索现代 JavaScript 生态系统时&#xff0c;我们常常会遇到新兴技术的快速迭代和改进。其中&#xff0c;包管理工具的发展尤为重要&#xff0c;因为它们直接影响开发效率和项目性能。最近&#xff0c;pnpm 作为一种新的包管理工具引起了广泛关注。它不仅挑战了传统工具如 np…...

汽车IVI中控开发入门及进阶(三十二):i.MX linux开发之Yocto

前言: 对于NXP的i.mx,如果基于linux开发,需要熟悉以下文档: IMX_YOCTO_PROJECT_USERS_GUIDE.pdf IMX_LINUX_USERS_GUIDE.pdf IMX_GRAPHICS_USERS_GUIDE.pdf 如果基于android开发,需要熟悉一下文档: Android_Auto_Quick_Start_Guide.pdf ANDROID_USERS_GUIDE.pdf …...

tessy 编译报错:单元测试时,普通桩函数内容相关异常场景

目录 1&#xff0c;失败现象 2&#xff0c;原因分析 1&#xff0c;失败现象 1&#xff0c;在 step 桩函数正常的情况下报错。 2&#xff0c;测试代码执行的数据流 和 step 桩函数内容不一致。 2&#xff0c;原因分析 桩函数分为 test object, test case, test step 三种类别。…...

计算机专业是否仍是“万金油”

作为一名即将参加高考的学生&#xff0c;我站在人生的分岔路口上&#xff0c;面临着选择大学专业的重大抉择。在这个关键节点&#xff0c;计算机相关专业是否仍是炙手可热的选择&#xff1f;  首先&#xff0c;从行业的角度来看&#xff0c;计算机相关专业确实在近年来持续火…...

雷池社区版自动SSL

正常安装雷池&#xff0c;并配置站点&#xff0c;暂时不配置ssl 不使用雷池自带的证书申请。 安装&#xff08;acme.sh&#xff09;&#xff0c;使用域名验证方式生成证书 先安装git yum install git 或者 apt-get install git 安装完成后使用 git clone https://gitee.com/n…...

怎样减少徐州服务器租用的成本?

服务器租用的出现&#xff0c;十分便于网络行业的发展&#xff0c;但是随着服务器租用的广泛应用&#xff0c;整体还是有着一定的成本的吗&#xff0c;不同的服务器类型在价格方面也是不同的&#xff0c;那么企业在选择服务器租用后&#xff0c;怎样才能减少服务器租用的成本呢…...

【性能优化】表分桶实践最佳案例

分桶背景 随着企业的数据不断增长&#xff0c;数据的分布和访问模式变得越来越复杂。我们前面介绍了如何通过对表进行分区来提高查询效率&#xff0c;但对于某些特定的查询模式&#xff0c;特别是需要频繁地进行数据联接查或取样的场景&#xff0c;仍然可能面临性能瓶颈。此外…...

数据仓库的挑战

建设数据仓库是一个复杂且资源密集的过程&#xff0c;需要考虑多个方面。以下是建设数据仓库时常见的挑战及其详细解释&#xff1a; 1. 数据集成 挑战&#xff1a; 数据来源多样&#xff1a;数据来自不同的系统、数据库、文件格式&#xff08;如CSV、JSON、XML&#xff09;、…...

基于ResNet-18的简单分类(新手,而且网络效果不咋滴,就是学个流程)

引言 先看问题&#xff1a; 我手边有一数据集&#xff0c;然后我想分分类&#xff01;~~ 咳咳&#xff0c;最近刚做了一个&#xff1a;训练集有1143张&#xff0c;分为5类&#xff0c;里面图片是打乱的。测试集有248张&#xff0c;想把它分分类看看咋样。 再看一下效果: …...

自动化测试:Autorunner的使用

自动化测试&#xff1a;Autorunner的使用 一、实验目的 1、掌握自动化测试脚本的概念。 2、初步掌握Autorunner的使用 二、Autorunner的简单使用 autoRunner使用方法 新建项目 a) 在项目管理器空白区域,右键鼠标,选择新建项目 b) 输入项目名后,点击[确定]. 在初次打开aut…...

时序预测 | Matlab基于CNN-BiLSTM-Attention多变量时间序列多步预测

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab基于CNN-BiLSTM-Attention多变量时间序列多步预测&#xff1b; 2.多变量时间序列数据集&#xff08;负荷数据集&#xff09;&#xff0c;采用前96个时刻预测的特征和负荷数据预测未来96个时刻的负荷数据&…...

软考 系统架构设计师系列知识点之杂项集萃(42)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之杂项集萃&#xff08;41&#xff09; 第67题 Windows操作系统在图形界面处理方面采用的核心架构风格是&#xff08; &#xff09;风格。Java语言宣传的“一次编写&#xff0c;到处运行”的特性&#xff0c;从架构风格…...

FastBoot刷机获取root权限(Magisk)

1.首先要下载ADB、Fastboot等工具。 1.ADB、Fastboot工具 https://developer.android.com/studio/releases/platform-tools 2.安装FastBoot的USB驱动 https://developer.android.com/studio/run/oem-usb 2.下载对应的镜像 https://developers.google.com/android/images?…...

信息检索(43):SPLADE: Sparse Lexical and Expansion Model for First Stage Ranking

SPLADE: Sparse Lexical and Expansion Model for First Stage Ranking 摘要1 引言2 相关工作3 方法3.1 SparTerm3.2 SPLADE&#xff1a;稀疏词汇和扩展模型 4 实验5 结论 发布时间&#xff08;2021&#xff09; 标题&#xff1a;稀疏词汇 扩展模型 摘要 稀疏的优点&#xf…...

DockerHub 镜像加速

Docker Hub 作为目前全球最大的容器镜像仓库&#xff0c;为开发者提供了丰富的资源。Docker Hub 是目前最大的容器镜像社区&#xff0c;DokcerHub的不能使用,导致在docker下pull镜像无法下载,安装kubernetes镜像也受到影响,下面请看解决方式。 1.加速原理 Docker下载加速的原理…...

Oracle 迁移 Mysql

-- Oracle->MySQL -- 使用时改一下where条件的owner和table_name -- 字段数据类型映射时会将Oracle中的浮点NUMBER转换为decimal(65,8)定点数 -- 可以识别主键约束、非空约束&#xff0c;但无法识别外键约束、唯一约束、自定义check -- 对于Oracle字符串长度为4000的&#x…...

vue3父子组件通信

一&#xff0c;父传子——defineProps 方法&#xff1a; 在父组件的模板中使用子组件标签&#xff0c;并且给标签自定义属性和属性名&#xff0c;即通过v-bind绑定数值&#xff0c;而后传给子组件&#xff1b;子组件则通过defineProps接收使用。 父组件&#xff1a; <tem…...

CSS中使用应用在伪元素中的计数器属性counter-increment

在CSS中&#xff0c;counter-increment 是一个用于递增计数器值的属性。它通常与 counter-reset 和 content 属性一起使用&#xff0c;以在文档中的特定位置&#xff08;如列表项、标题等&#xff09;插入自动生成的数字或符号。 counter-increment 基本用法&#xff1a; 使…...

【SkiaSharp绘图08】SKPaint方法:自动换行、是否乱码、字符偏移、边界、截距、文本轮廓、测量文本

文章目录 SKPaint方法BreakText 计算指定宽度内可绘制的字符个数ContainsGlyphs字体是否包含文本字符(是否会乱码)GetGlyphOffsets 字符偏移量GetGlyphPositions 偏移坐标GetGlyphWidths 每个字符的宽度与边界GetHorizontalTextIntercepts 轮廓截距GetPositionedTextIntercepts…...

深入理解Servlet Filter及其限流实践

引言 在Java Servlet技术中&#xff0c;Filter是一个拦截器&#xff0c;它允许开发者在请求到达目标资源之前或响应发送给客户端之后&#xff0c;对请求或响应进行拦截和处理。这种机制为实现诸如身份验证、日志记录、请求修改等功能提供了极大的灵活性。 Filter基础 Filter…...

使用cv2对视频指定区域进行去噪

视频去噪其实和图象一样&#xff0c;只是需要现将视频截成图片&#xff0c;在对图片进行去噪&#xff0c;将去噪的图片在合成视频就行。可以利用cv2.imread()、imwrite()等轻松实现。 去噪步骤 1、视频逐帧读成图片 2、图片指定区域批量去噪 2、去噪后的图片写入视频 1、视频逐…...

AI在创造还是毁掉音乐?

AI对音乐产业的影响是复杂而多维的&#xff0c;既有创造性的贡献也存在潜在的挑战。我们可以从以下几个角度来分析这个问题&#xff1a; ### 创造性贡献 1. **音乐创作**&#xff1a;AI可以帮助音乐家创作新的旋律和和声&#xff0c;甚至生成完整的音乐作品。例如&#xff0c…...

郑州优化网站 优帮云/信息流优化师需要具备哪些能力

文章目录一、进程的创建二、文件描述符三、管道及重定向一、进程的创建 教程地址 Linux 系统调用 system&#xff08;&#xff09;函数详解 mysys.c: 实现函数mysys&#xff0c;用于执行一个系统命令&#xff0c;要求如下 mysys的功能与系统函数system相同&#xff0c;要求用…...

怎么进入公众号后台/百度seo优化分析

静态JS和POSTMAN下可直接使用的SM2签名验签功能。 0. 目录1. 前言2. JS工具脚本3. 测试用例4. Links1. 前言 相较于笔者的大部分博文&#xff0c;本文只是提供一个现成的工具&#xff0c;因此废话少说&#xff0c;直入主体。 2. JS工具脚本 将以下内容拷贝到 POSTMAN的 pre-…...

网站建设 长春/google推广 的效果

Python3.x 1 数据类型 1.0 标准数据类型 Python3.x标准数据类型有6中,如下: 序号数据类型描述1数字Number2字符串String3列表List4元组Tuple5字典Dictionary6集合Set 1.2 数字(Number) 数字包括整数,浮点数,布尔数据和复数四种,python3.x中将True和False定义成关键字,表示…...

做奖杯的企业网站/百度seo课程

文章目录报错解决VM 将宿主机文件夹 映射至 虚拟机以及vm tools【共享文件夹、复制粘贴、拖动上传下载】报错解决 VMware Workstation 无法连接到虚拟机。请确保您有权运行该程序、访问该程序使用的所有目录以及访问所有临时文件目录。 这个主要是由于我没有关闭虚拟机就直接强…...

钦州公司做网站/游戏推广公司靠谱吗

Edge浏览器主页被360劫持怎么办 &#xff1f; 我出现的问题是在安装了360安全卫士之后&#xff0c;每次打开Edge浏览器&#xff0c;出现的都是360浏览器界面&#xff0c;全是一堆的垃圾广告和信息&#xff0c;太影响效率了。经查证&#xff0c;是Edge浏览器被360劫持了&#xf…...

成都公司做网站的/如何进行网络推广

第一部分 计算机基础知识部分习题一、选择题静态RAM的特点是A在不断电的条件下&#xff0c;信息在静态RAM中保持不变&#xff0c;故而不必定期刷新就能永久保存信息在不断电的条件下&#xff0c;信息在静态RAM中不能永久无条件保持&#xff0c;必须定期刷新才不致丢失信息在静态…...