【面试干货】 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💖点点关注,收藏不迷路💖

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React的State和setState

如何确地使用 State 不要直接修改 State.修改State应该使用 setState():构造函数是唯一可以给 this.state 赋值的地方 State 与 props 类似&#xff0c;但是 state 是私有的&#xff0c;并且完全受控于当前组件 我们可以在我们的自定义组件中添加私有的State jcode class C…

虚拟机拖拽文档造成缓存过大

查看文件夹大小&#xff1a;du -h --max-depth1 缓存位置&#xff1a;~/.cache/vmware/drag_and_drop 删除&#xff1a;rm -fr ~/.cache/vmware/drag_and_drop 释放了3GB

CVPR上新 | 从新视角合成、视频编解码器、人体姿态估计,到文本布局分析,微软亚洲研究院精选论文

编者按&#xff1a;欢迎阅读“科研上新”栏目&#xff01;“科研上新”汇聚了微软亚洲研究院最新的创新成果与科研动态。在这里&#xff0c;你可以快速浏览研究院的亮点资讯&#xff0c;保持对前沿领域的敏锐嗅觉&#xff0c;同时也能找到先进实用的开源工具。 本周&#xff0…

python如何判断图片是否为空

如下所示&#xff1a; import cv2im cv2.imread(2.jpg) if im is None:print("图像为空") # cv2.imshow("ss", im) # cv2.waitKey(0)

编码规则UTF-8 和 UTF-16的区别

UTF-8 和 UTF-16 的设计背景与历史 为了更好地理解 UTF-8 和 UTF-16 的设计选择和背景&#xff0c;以下是两种编码方案的历史、设计动机和它们在计算机科学中的应用。 Unicode 的背景 在 Unicode 之前&#xff0c;不同的字符集和编码方案使得跨平台和国际化的文本处理变得复…

2024年AI+游戏赛道的公司和工具归类总结

随着人工智能技术的飞速发展,AI在游戏开发领域的应用越来越广泛。以下是对2024年AI+游戏赛道的公司和工具的归类总结,涵盖了从角色和场景设计到音频制作,再到动作捕捉和动画生成等多个方面。 2D与3D创作 2D创作工具:专注于角色和场景的平面设计,提供AI辅助的图案生成和风…

【2024德国工作】外国人在德国找工作是什么体验?

挺难的&#xff0c;德语应该是所有中国人的难点。大部分中国人进德国公司要么是做中国业务相关&#xff0c;要么是做技术领域的工程师。先讲讲人在中国怎么找德国的工作&#xff0c;顺便延申下&#xff0c;德国工作的真实体验&#xff0c;最后聊聊在今年的德国工作签证申请条件…

【八股系列】说一下mobx和redux有什么区别?(React)

&#x1f389; 博客主页&#xff1a;【剑九 六千里-CSDN博客】 &#x1f3a8; 上一篇文章&#xff1a;【介绍React高阶组件&#xff0c;适用于什么场景&#xff1f;】 &#x1f3a0; 系列专栏&#xff1a;【面试题-八股系列】 &#x1f496; 感谢大家点赞&#x1f44d;收藏⭐评…

双例集合(二)——双例集合的实现类之HashMap容器类

双例集合的常用实现类有HashMap和TreeMap两个&#xff0c;通过这两个类我们可以实现Map接口定义的容器&#xff0c;一般情况下使用HashMap容器类较多。 HashMap容器类是Map接口最常用的实现类&#xff0c;它的底层采用Hash算法来实现&#xff0c;这也就满足了键key不能重复的要…

揭秘!速卖通、敦煌网、国际站出单背后的黑科技:自养号测评技术

在竞争激烈的跨境电商平台上&#xff0c;如亚马逊、速卖通、Lazada、Shopee、敦煌网、Temu、Shein、美客多和阿里国际等&#xff0c;稳定出单成为每位卖家共同追求的目标。为了实现这一目标&#xff0c;卖家需要从产品选择、运营策略和客户服务等多个维度进行全面考量&#xff…

华为重磅官宣:超9亿台、5000个头部应用已加入鸿蒙生态!人形机器人现身 专注AI芯片!英伟达挑战者Cerebras要上市了

内容提要 华为表示&#xff0c;盘古大模型5.0加持&#xff0c;小艺能力全新升级。小艺智能体与导航条融为一体&#xff0c;无处不在&#xff0c;随时召唤。只需将文字、图片、文档“投喂”小艺&#xff0c;即可便捷高效处理文字、识别图像、分析文档。 正文 据华为终端官方微…

JavaWeb阶段学习知识点(一)

【参考视频】https://www.bilibili.com/video/BV1m84y1w7Tb?p=167&vd_source=38a16daddd38b4b4d4536e9c389e197f SpringBoot项目的创建和接口配置 做一个springboot项目,从创建项目到实现浏览器访问localhost:8080/hello返回字符串hello world的全流程 1. 创建项目 idea新…

上海科技博物馆超薄OLED柔性壁纸屏应用方案

产品&#xff1a;2组55寸OLED柔性屏2x1 特点&#xff1a;嵌入墙体&#xff0c;与空间装饰融入一体 用途&#xff1a;播放文物展示 一、项目背景 上海科技博物馆作为展示科技与文化的交汇点&#xff0c;一直致力于为观众提供沉浸式的参观体验。为了提升文物展示的现代化和科技感…

芯片验证分享系列总结及PPT分享

大家好&#xff0c;我是谷公子。花了将近两个月时间&#xff0c;《芯片验证分享》这一系列视频分享已经更新完了&#xff0c;内容涵盖了名词解释、芯片验证原则、激励开发、代码审查以及芯片调试。这一系列视频主要侧重于芯片验证理论的分享&#xff0c;希望可以帮助大家构建芯…

wvp-GB28181-pro 源码分析-点播流程(三)

文章目录 一 、28181-2016标准文档中的点播流程二 、点播流程源码分析2.1 页面发起点播请求2.2 与ZLM协商SSRC信息2.3 订阅zlmediakit的hook消息及发送invite信令2.4 处理invite信令响应并应答2.5 收到ZLM的推流通知2.6 播放成功2.7 停止点播流程2024年6月20日下载的wvp-GB2818…

程序员·职场效能必修宝典㊿:正视自己的职业倦怠

> 【易编橙终身成长社群,相遇已是上上签!】- 点击跳转~ < 作者:哈哥撩编程 (视频号同名) 图书作者:程序员职场效能宝典 博客专家:全国博客之星第四名 超级个体:COC上海社区主理人 特约讲师:谷歌亚马逊分享嘉宾

VBA语言専攻T3学员领取资料通知

各位学员∶本周MF系列VBA技术资料增加631-635讲&#xff0c;T3学员看到通知后请免费领取,领取时间6月21日晚上19:00-6月22日晚上20:00。本次增加内容&#xff1a; MF631:提取某列数据的唯一值 MF632:自动调整文本并旋转到90度 MF633:仅复制格式 MF634:Mod运算判断奇数偶数 …

又发现一款独立清理神器,界面清爽,功能强大,没有广告!

360清理Pro独立提取版是360公司推出的一款清理软件&#xff0c;主要用于清理系统垃圾和优化系统性能&#xff0c;涵盖了四大类型的清理场景&#xff0c;分别为&#xff1a;微信、QQ的垃圾扫描及清理&#xff0c;系统盘中的大文件、重复文件扫描及清理以及系统软件使用痕迹的清理…

毕业答辩制作PPT【攻略】

毕业答辩制作PPT【攻略】 前言版权毕业答辩制作PPT【攻略】一、WPS AI 15天免费会员二、AI文档生成PPT三、修改完善PPT 最后 前言 2024-06-14 23:43:05 以下内容源自《【攻略】》 仅供学习交流使用 版权 禁止其他平台发布时删除以下此话 本文首次发布于CSDN平台 作者是CSDN…

fast lio 运行mid360采集的数据,并保存每一帧的点云PCD和位姿

首先我们看到在map_incremental中存在一个保存每一帧PCD文件的代码&#xff0c;因此想利用改代码。 如何修改呢&#xff1f; 一. 改每一帧无畸变点云的PCD的保存代码 /**************** save map ****************//* 1. make sure you have enough memories/* 2. noted that…