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

Java高频面试之集合-20

hello啊,各位观众姥爷们!!!本baby今天来报道了!哈哈哈哈哈嗝🐶

面试官:讲讲 HashSet 的底层实现?

HashSet 是 Java 集合框架中用于存储唯一元素的高效数据结构,其底层实现基于 HashMap。以下是其核心实现细节:


一、底层数据结构

  • 依赖关系
    HashSet 内部维护了一个 HashMap 实例,通过操作 HashMap 的键(Key)来存储元素,而值(Value)统一为固定的 虚拟对象PRESENT)。

    private transient HashMap<E, Object> map;
    private static final Object PRESENT = new Object(); // 占位值
    
  • 元素存储
    添加元素时,元素本身作为 HashMap 的键,而值固定为 PRESENT

    public boolean add(E e) {return map.put(e, PRESENT) == null; // 若返回 null,说明键不存在,添加成功
    }
    

二、核心特性

  1. 唯一性保证

    • 依赖 HashMap 键的唯一性机制,通过 equals()hashCode() 判断元素是否重复。
    • 若两个元素的 hashCode() 相同且 equals() 返回 true,则视为重复,无法添加。
  2. 无序性

    • 元素的存储和遍历顺序由 HashMap 的哈希分布决定,不保证任何顺序(如插入顺序或自然顺序)。
    • 若需有序性,可使用 LinkedHashSet(维护插入顺序)或 TreeSet(自然排序)。
  3. 线程不安全

    • HashMap 类似,多线程并发操作可能导致数据不一致。
    • 解决方案:
      Set<String> syncSet = Collections.synchronizedSet(new HashSet<>());
      

三、性能分析

操作时间复杂度说明
添加(add)平均 O(1),最差 O(n)哈希冲突少时接近 O(1),冲突多时退化为链表或红黑树(JDK 8+)。
删除(remove)平均 O(1),最差 O(n)与添加类似,依赖哈希冲突情况。
查询(contains)平均 O(1),最差 O(n)直接通过哈希定位桶,遍历链表或树。

四、关键参数与优化

  1. 初始容量(Initial Capacity)

    • 默认值:16,表示哈希表的初始桶数量。
    • 设置建议:预估元素数量,避免频繁扩容(如 new HashSet<>(100))。
  2. 负载因子(Load Factor)

    • 默认值:0.75,表示当元素数量达到 容量 × 负载因子 时触发扩容。
    • 扩容规则:容量翻倍(如 16 → 32),重新哈希所有元素。
  3. 哈希冲突处理

    • JDK 8 优化:链表长度 ≥8 且容量 ≥64 时,链表转为红黑树;树节点 ≤6 时退化为链表。

五、与 HashMap 的关系

维度HashSetHashMap
存储内容仅存储键(Key)存储键值对(Key-Value)
唯一性判断依赖键的 equals()hashCode()同 HashSet
内存占用更小(无冗余 Value 存储)更大(需存储 Value)

六、示例代码

Set<String> set = new HashSet<>();
set.add("Apple");
set.add("Banana");
set.add("Apple"); // 重复元素,添加失败System.out.println(set); // 输出:[Apple, Banana](顺序不固定)

🐮🐎

  • 底层机制HashSet 通过复用 HashMap 的键唯一性实现元素去重。
  • 适用场景:高频插入、删除和唯一性校验场景(如缓存去重、黑名单过滤)。
  • 注意事项:合理设置初始容量和负载因子以优化性能,多线程环境需额外同步。

在这里插入图片描述

相关文章:

Java高频面试之集合-20

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天来报道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面试官&#xff1a;讲讲 HashSet 的底层实现&#xff1f; HashSet 是 Java 集合框架中用于存储唯一元素的高效数据结构&#xff0c;其底层实…...

sort命令:排序

sort&#xff1a;默认首位排序 参数&#xff1a; -n&#xff1a;按整个数字排序 -r&#xff1a;降序 -u&#xff1a;去重 [rootrobin ~]# sort -n aa.txt #按数字排序&#xff08;正序&#xff09; [rootrobin ~]# sort -nr aa.txt #降序 [rootrobin ~]# sort -…...

Javaweb后端 AOP快速入门 AOP核心概念 AOP执行流程

AOP是对特定方法编程&#xff0c;把共用都用的方法提取出来&#xff0c;统一维护 AOP基础 AOP快速入门 对原始方法无影响 AOP核心概念 连接点&#xff0c;是原始方法&#xff0c;被控制范围内的原始方法 通知&#xff0c;AOP类里面写的公共的方法 切入点&#xff0c;实际被AO…...

deepseek ai 输入法

一、简介 使用java开发一个安卓输入法接入deepseek实现ai聊天&#xff0c;代码已开源。 二、视频演示 deepseek输入法_哔哩哔哩_bilibili 三、开源地址 https://github.com/deepseek/inputmethed 四、技术细节 CustomInputMethodService.java 输入法服务类 MainActivity.…...

Rust 所有权与引用

目录 Rust 所有权原则变量所有权变量作用范围深拷贝 Rust 的引用示例可变引用不可变引用可变引用和不可变引用不能同时存在悬垂引用 Rust 所有权原则 Rust 中每一个值都被一个变量所拥有&#xff0c;该变量被称为值的所有者一个值同时只能被一个变量所拥有&#xff0c;或者说一…...

探究 CSS 如何在HTML中工作

2025/3/28 向全栈工程师迈进&#xff01; 一、CSS的作用 简单一句话——美化网页 <p>Lets use:<span>Cascading</span><span>Style</span><span>Sheets</span> </p> 对于如上代码来说&#xff0c;其显示效果如下&#xff1…...

Verilog中X态的危险:仿真漏掉的bug

由于Verilog中X态的微妙语义&#xff0c;RTL仿真可能PASS&#xff0c;而网表仿真却会fail。 目前进行的网表仿真越来越少&#xff0c;这个问题尤其严重&#xff0c;主要是网表仿真比RTL仿真慢得多&#xff0c;因此对整个回归测试而言成本效益不高。 上面的例子中&#xff0c;用…...

使用 uv 管理 Python 项目

介绍 首先, uv 工具是使用 rust 开发出来的, 速度要比传统的 pip, pipx 等一众包管理工具要快不少. 另外, 除了包管理之外, uv 还提供了脚手架的功能, 使用体验和前端开发使用过的 vue-cli 很相似, 可以帮助我们自动初始化项目, 创建好一个空的包含必要文件结构的文件夹. 此外…...

【操作系统】软中断vs硬中断

在操作系统中&#xff0c;中断&#xff08;Interrupt&#xff09; 是 CPU 响应外部事件的重要机制&#xff0c;分为 硬中断&#xff08;Hardware Interrupt&#xff09; 和 软中断&#xff08;Software Interrupt&#xff09;。它们的核心区别在于 触发方式 和 处理机制。 1. 硬…...

《C++11:通过thread类编写C++多线程程序》

关于多线程的概念与理解&#xff0c;可以先了解Linux下的底层线程。当对底层线程有了一定程度理解以后&#xff0c;再学习语言级别的多线程编程就轻而易举了。 【Linux】多线程 -&#xff1e; 从线程概念到线程控制 【Linux】多线程 -&#xff1e; 线程互斥与死锁 语言级别的…...

19-dfs-排列数字(基础)

题目 来源 842. 排列数字 - AcWing题库 思路 由于相对简单&#xff0c;是dfs的模板题&#xff0c;具体思路详见代码 代码 #include<bits/stdc.h> using namespace std; const int N10; int state[N],path[N];//是否使用过&#xff0c;当前位置 int n; void dfs(int …...

32.代码题

接着上集...... 派对&#xff1a;超时了&#xff0c;总该受到惩罚吧&#xff1f; 洛西&#xff1a;至于吗&#xff1f;就0.1秒&#xff01; 晴/宇&#xff1a;十分应该。 洛西&#xff1a;我..................... 没办法&#xff0c;洛西只能按照要求去抓R了。 1.P1102 …...

nacos 3.x Java SDK 使用详解

Nacos 3.x Java SDK 使用详解 Nacos 3.x 是云原生服务治理的重要升级版本&#xff0c;其 Java SDK 在性能、协议和扩展性上均有显著优化。 一、环境要求与依赖配置 基础环境 JDK 版本&#xff1a;需使用 JDK 17&#xff08;Nacos 3.x 已放弃对 JDK 8 的支持&#xff09;。Spri…...

SPI-NRF24L01

模块介绍 NRF24L01是NORDIC公司生产的一款无线通信芯片&#xff0c;采用FSK调制&#xff0c;内部集成NORDIC自己的Enhanced Short Burst 协议&#xff0c;可以实现点对点或者1对6 的无线通信,通信速率最高可以达到2Mbps. NRF24L01采用SPI通信。 ①MOSI 主器件数据输出&#xf…...

python黑科技:无痛修改第三方库源码

需求不符合 很多时候&#xff0c;我们下载的 第三方库 是不会有需求不满足的情况&#xff0c;但也有极少的情况&#xff0c;第三方库 没有兼顾到需求&#xff0c;导致开发者无法实现相关功能。 如何通过一些操作将 第三方库 源码进行修改&#xff0c;是我们将要遇到的一个难点…...

一区严选!挑战5天一篇脂质体组学 DAY1-5

Day 1! 前期已经成功挑战了很多期NHANES啦&#xff01;打算来试试孟德尔随机化领域&#xff5e; 随着孟德尔随机化研究的普及&#xff0c;现在孟德尔发文的难度越来越高&#xff0c;简单的双样本想被接收更是难上加难&#xff0c;那么如何破除这个困境&#xff0c;这次我打算…...

【JavaScript】合体期功法——DOM(二)

目录 DOM事件监听案例关闭广告随机点名 事件监听版本事件类型 DOM 事件监听 事件&#xff1a;编程时系统内发生的动作或事情&#xff0c;例如用户在网页上单击一个按钮 事件监听&#xff1a;让程序检测是否产生事件&#xff0c;一旦事件触发&#xff0c;立即调用函数做出响应…...

23种设计模式中的中介者模式

定义了一个中介对象来封装一系列对象之间的交互。中介者使各对象直接不再显示地相互引用&#xff0c;从而使其松散耦合&#xff0c;且可以独立地改变它们之间的交互。 通过引入一个中介者对象&#xff0c;来协调和封装多个对象之间的交互&#xff0c;从而降低他们之间的耦合度。…...

量子计算:开启未来计算的新纪元

一、引言 在当今数字化时代&#xff0c;计算技术的飞速发展深刻地改变了我们的生活和工作方式。从传统的电子计算机到如今的高性能超级计算机&#xff0c;人类在计算能力上取得了巨大的进步。然而&#xff0c;随着科技的不断推进&#xff0c;我们面临着越来越多的复杂问题&…...

Docker 的实质作用是什么

Docker 的实质作用是什么 目录 Docker 的实质作用是什么**1. Docker 的实质作用****2. 为什么使用 Docker?****(1)解决环境一致性问题****(2)提升资源利用率****(3)简化部署与扩展****(4)加速开发与协作****3. 举例说明****总结**Docker 的实质是容器化平台,核心作用…...

Assembly语言的装饰器

Assembly语言的装饰器&#xff1a;灵活高效的代码复用 引言 在软件开发中&#xff0c;代码复用和模块化是两个至关重要的概念。它们不仅使得代码的维护变得更为简单&#xff0c;而且能极大提升开发效率。在高级语言中&#xff0c;装饰器是一种非常受欢迎的设计模式&#xff0…...

VITA 模型解读,实时交互式多模态大模型的 pioneering 之作

写在前面:实时交互llm 今天回顾一下多模态模型VITA,当时的背景是OpenAI 的 GPT-4o 惊艳亮相,然而,当我们将目光投向开源社区时,却发现能与之匹敌的模型寥寥无几。当时开源多模态大模型(MLLM),大多在以下一个或多个方面存在局限: 模态支持不全:大多聚焦于文本和图像,…...

自学-408-《计算机网络》(总结速览)

文章目录 第一章 计算机网络概述1. 计算机网络的定义2. 计算机网络的基本功能3. 计算机网络的分类4. 计算机网络的层次结构5. 计算机网络的协议6. 计算机网络的组成部分7. 计算机网络的应用8. 互联网的概念 物理层的主要功能第二章 数据链路层和局域网1. 数据链路层的功能2. 局…...

AF3 FeaturePipeline类解读

AlphaFold3 feature_pipeline 模块 FeaturePipeline 类是一个封装类,通过调用函数np_example_to_features 实现整个数据处理流程。 源代码: def np_to_tensor_dict(np_example: Mapping[str, np.ndarray],features: Sequence[str], ) -> TensorDict:"""C…...

【质量管理】纠正、纠正措施和预防的区别与解决问题的四重境界

“质量的定义就是符合要求”&#xff0c;我们在文章【质量管理】人们对于质量的五个错误观念-CSDN博客中提到过&#xff0c;这也是质量大师克劳士比所说的。“质量的系统就是预防”&#xff0c;防止出现产品不良而造成的质量损失。 质量问题的解决可以从微观和宏观两个方面来考…...

Java面试黄金宝典24

1. 什么是跳表 定义 跳表&#xff08;Skip List&#xff09;是一种随机化的数据结构&#xff0c;它基于有序链表发展而来&#xff0c;通过在每个节点中维护多个指向其他节点的指针&#xff0c;以多层链表的形式组织数据。其核心思想是在链表基础上增加额外层次&#xff0c;每…...

Windows 11系统下Kafka的详细安装与启动指南(JDK 1.8)

1. 安装前准备 在Windows 11系统中安装Kafka之前,需要确保满足以下条件: 1.1 系统要求 Windows 11操作系统(64位)至少4GB内存(建议8GB或更高)至少5GB可用磁盘空间管理员权限1.2 所需工具 浏览器(用于下载软件)解压工具(如7-Zip、WinRAR,Windows 11自带的解压功能也…...

树莓派超全系列文档--(16)无需交互使用raspi-config工具其三

无需交互使用raspi-config工具其三 无需交互的 raspi-configAdvanced optionsExpand filesystemNetwork interface namesNetwork proxy settingsBoot orderBootloader versionWaylandAudio config Update 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文…...

【蓝桥杯】算法笔记1

1.暴力枚举 给定一个正整数n,请找出所有满足a + b = n的整数对(a, b),其中a和b都是正整数,且a ≤ b。 输入格式:一个正整数n (1 ≤ n ≤ 10⁶) 输出格式:所有符合条件的(a, b)对,每行一对,按a的升序排列。如果没有符合条件的对,输出"No solution"。 问题分…...

爱因斯坦求和 torch

目录 向量点积 矩阵乘法 矩阵转置 向量转换相机坐标系 在 Python 的科学计算库&#xff08;如 NumPy&#xff09;中&#xff0c;einsum 是一个强大的函数&#xff0c;它可以简洁地表示各种张量运算。下面是几个不同类型的使用示例&#xff1a; 向量点积 向量点积是两个向量…...