java-HashSet 源码分析 1
## 深入分析 Java 中的 `HashSet` 源码
`HashSet` 是 Java 集合框架中的一个重要类,它基于哈希表实现,用于存储不重复的元素。`HashSet` 允许 `null` 元素,并且不保证元素的顺序。本文将详细分析 `HashSet` 的源码,包括其数据结构、构造方法、核心操作、内部实现机制等。
### 1. `HashSet` 的基本数据结构
`HashSet` 是基于 `HashMap` 实现的,每个 `HashSet` 内部都维护了一个 `HashMap` 实例,用于存储元素。`HashSet` 的元素作为 `HashMap` 的键,所有键对应的值为一个常量对象。
`HashSet` 类的基本结构如下:
```java
public class HashSet<E> extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable {
static final long serialVersionUID = -5024744406713321676L;
// 底层使用的 HashMap
private transient HashMap<E, Object> map;
// HashSet 中所有键对应的值
private static final Object PRESENT = new Object();
// 默认构造方法
public HashSet() {
map = new HashMap<>();
}
// 其他构造方法和方法定义
}
```
- `map`:底层使用的 `HashMap` 实例,用于存储元素。
- `PRESENT`:`HashMap` 中所有键对应的值,这是一个常量对象。
### 2. 构造方法
`HashSet` 提供了多个构造方法,以满足不同的初始化需求。
#### 2.1 默认构造方法
```java
public HashSet() {
map = new HashMap<>();
}
```
默认构造方法使用默认初始容量(16)和加载因子(0.75)创建一个空的 `HashMap` 实例。
#### 2.2 指定初始容量和加载因子的构造方法
```java
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<>(initialCapacity, loadFactor);
}
```
此构造方法允许用户指定 `HashMap` 的初始容量和加载因子。
#### 2.3 指定初始容量的构造方法
```java
public HashSet(int initialCapacity) {
map = new HashMap<>(initialCapacity);
}
```
此构造方法允许用户指定 `HashMap` 的初始容量,加载因子使用默认值 0.75。
#### 2.4 从另一个集合创建 `HashSet`
```java
public HashSet(Collection<? extends E> c) {
map = new HashMap<>(Math.max((int) (c.size() / .75f) + 1, 16));
addAll(c);
}
```
此构造方法从另一个集合创建 `HashSet`,并将集合中的所有元素添加到 `HashSet` 中。
### 3. 核心操作方法
#### 3.1 添加元素
`HashSet` 提供了添加元素的方法 `add(E e)`:
```java
public boolean add(E e) {
return map.put(e, PRESENT) == null;
}
```
- `add(E e)`:将元素 `e` 添加到 `HashSet` 中。实际上是将元素 `e` 作为键,`PRESENT` 作为值存入 `HashMap` 中。如果键 `e` 已存在,则返回 `false`;否则返回 `true`。
#### 3.2 删除元素
`HashSet` 提供了删除元素的方法 `remove(Object o)`:
```java
public boolean remove(Object o) {
return map.remove(o) == PRESENT;
}
```
- `remove(Object o)`:从 `HashSet` 中删除指定的元素 `o`。如果 `HashMap` 中存在键 `o`,则删除并返回 `true`;否则返回 `false`。
#### 3.3 判断是否包含元素
`HashSet` 提供了判断是否包含某个元素的方法 `contains(Object o)`:
```java
public boolean contains(Object o) {
return map.containsKey(o);
}
```
- `contains(Object o)`:判断 `HashSet` 中是否包含指定的元素 `o`。实际上是调用 `HashMap` 的 `containsKey(Object key)` 方法。
#### 3.4 清空 `HashSet`
`HashSet` 提供了清空所有元素的方法 `clear()`:
```java
public void clear() {
map.clear();
}
```
- `clear()`:清空 `HashSet` 中的所有元素。实际上是调用 `HashMap` 的 `clear()` 方法。
### 4. 内部实现机制
#### 4.1 `HashMap` 的工作原理
为了更好地理解 `HashSet` 的实现,有必要了解 `HashMap` 的工作原理。`HashMap` 是基于哈希表的数据结构,通过散列函数将键映射到数组中的位置,从而实现快速查找、插入和删除操作。
#### 4.2 `HashMap` 的核心操作
- **计算哈希值**:`HashMap` 使用键的 `hashCode()` 方法计算哈希值,并进一步对哈希值进行处理,以减少哈希冲突。
- **处理哈希冲突**:当两个不同的键映射到同一个位置时,`HashMap` 使用链地址法(即在数组的每个位置存储一个链表)处理冲突。
- **扩容**:当 `HashMap` 的负载因子超过阈值时(默认 0.75),`HashMap` 会进行扩容,将数组大小增加一倍,并重新分配所有键值对的位置。
#### 4.3 `HashSet` 中的元素存储
在 `HashSet` 中,所有元素都作为 `HashMap` 的键存储在哈希表中。由于 `HashMap` 的键不允许重复,因此 `HashSet` 中的元素也是唯一的。
### 5. 迭代器支持
`HashSet` 实现了 `Iterable` 接口,提供了支持迭代的功能:
```java
public Iterator<E> iterator() {
return map.keySet().iterator();
}
```
- `iterator()`:返回一个迭代器,用于遍历 `HashSet` 中的元素。实际上是调用 `HashMap` 的 `keySet()` 方法返回键集合的迭代器。
相关文章:
java-HashSet 源码分析 1
## 深入分析 Java 中的 HashSet 源码 HashSet 是 Java 集合框架中的一个重要类,它基于哈希表实现,用于存储不重复的元素。HashSet 允许 null 元素,并且不保证元素的顺序。本文将详细分析 HashSet 的源码,包括其数据结构、构造方法…...
K8S 部署 EFK
安装说明 系统版本为 Centos7.9 内核版本为 6.3.5-1.el7 K8S版本为 v1.26.14 ES官网 开始安装 本次安装使用官方ECK方式部署 EFK,部署的是当前的最新版本。 在 Kubernetes 集群中部署 ECK 安装自定义资源 如果能打开这个网址的话直接用这个命令安装,打不开的话…...
AI Earth应用—— 在线使用sentinel数据VV和VH波段进行水体提取分析(昆明抚仙湖、滇池为例)
AI Earth 本文的主要目的就是对水体进行提取,这里,具体的操作步骤很简单基本上是通过,首页的数据检索,选择需要研究的区域,然后选择工具箱种的水体提取分析即可,剩下的就交给阿里云去处理,结果如下: 这是我所选取的一景影像: 详情 卫星: Sentinel-1 级别: 1 …...
基于Hadoop平台的电信客服数据的处理与分析③项目开发:搭建基于Hadoop的全分布式集群---任务9:HBase的安装和部署
任务描述 任务内容为HBase的安装部署与测试。 任务指导 HBase集群需要整个集群所有节点安装的HBase版本保持一致,并且拥有相同的配置 具体配置步骤如下: 1. 解压缩HBase的压缩包 2. 配置HBase的环境变量 3. 修改HBase的配置文件,HBase…...
go语言day09 通道 协程的死锁
Go语言学习——channel的死锁其实没那么复杂 - JackieZheng - 博客园 (cnblogs.com) 目录 通道 创建通道 1)无缓冲通道 2)有缓冲通道 通道的使用 1) 值从通道入口进 2) 值从通道出口出 信道死锁: 0)死锁现场0 1)死…...
黑马的ES课程中的不足
在我自己做项目使用ES的时候,发现了黑马没教的方法,以及一些它项目的小问题 搜索时的匹配方法 这个boolQuery().should 我的项目是通过文章的标题title和内容content来进行搜索 但是黑马它的项目只用了must 如果我们的title和content都用must&#x…...
STM32 中断编程入门
目录 一、中断系统 1、中断的原理 2、中断类型 外部中断 定时器中断 DMA中断 3、中断处理函数 中断标志位清除 中断服务程序退出 二、实际应用 中断控制LED 任务要求 代码示例 中断控制串口通信 任务要求1 代码示例 任务要求2 代码示例 总结 学习目标&…...
使用maven搭建一个SpingBoot项目
1.首先创建一个maven项目 注意选择合适的jdk版本 2.添加依赖 2.在pom.xml中至少添加依赖 spring-boot-starter-web 依赖,目的是引入Tomcat,以及SpringMVC等,使项目具有web功能。 <!-- 引入 包含tomcat,SpringMVC,…...
使用 HTTPS 已成为网站的标配了
网站使用HTTPS的原因 背景:十年前,HTTPS并不普遍,但随着网络安全意识的提高,现在已成为网站标配。 网站升级到HTTPS的动机 安全问题:HTTP缺乏安全机制,易被窃取和篡改数据。例如,电信运营商劫…...
前后端分离Nginx
背景 旧的部署方式是将前端代码打包进后端包的resource server {listen 80;listen 443 ssl;server_name xxx.test.com;location / {proxy_pass http://xxx.test.com;} }后端:https:// xxx.test.com/simcard/querySimcard 前端:https:// x…...
【简单讲解下Tauri】
🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…...
mac上挂载linux目录
在 macOS 上挂载 CentOS 目录步骤: 在挂载前确保 macOS 和 CentOS 在同一个局域网内,并且可以相互访问。如果有网络配置问题,可能会导致挂载失败或连接被拒绝的错误。 要在 macOS 上将 CentOS 的 /disk2/go 目录通过 NFS 挂载到 /Users/zon…...
Linux系统的服务——以Centos7为例
一、Linux系统的服务简介 服务是向外部提供对应功能的进程,其运行在系统后台,能够7*24小时持续不断的提供外界随时发来的服务请求,且服务进程常驻在内存中,具有固定的端口号,通过端口号就能找到服务内容。 提供服务的一…...
Numpy矩阵运算
版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl Numpy概述 Numpy是Python的一个开源数值计算扩展库,主要用于存储和处理大型多维数组和矩阵,并且提供了大量的数学函数来操作这些数组。Numpy是Pytho…...
Spring容器Bean之XML配置方式
一、首先看applicationContext.xml里的配置项bean 我们采用xml配置文件的方式对bean进行声明和管理,每一个bean标签都代表着需要被创建的对象并通过property标签可以为该类注入其他依赖对象,通过这种方式Spring容器就可以成功知道我们需要创建那些bean实…...
【Rust入门】生成随机数
文章目录 前言随机数库rand添加rand库到我们的工程生成一个随机数示例代码 总结 前言 在编程中,生成随机数是一种常见的需求,无论是用于数据分析、游戏开发还是模拟实验。Rust提供了强大的库来帮助我们生成随机数。在这篇文章中,我们将通过一…...
普通Java工程如何在代码中引用docker-compose.yml中的environment值
文章目录 一、概述二、常规做法1. 数据库配置分离2. 代码引用配置3. 编写启动类4. 支持打包成可执行包5. 支持可执行包打包成docker镜像6. docker运行 三、存在问题分析四、改进措施1. 包含environment 变量的编排文件2. 修改读取配置文件方式3. 为什么可以这样做 五、运行效果…...
微观特征轮廓尺寸测量:光学3D轮廓仪、共焦显微镜与台阶仪的应用
随着科技进步,显微测量仪器以满足日益增长的微观尺寸测量需求而不断发展进步。多种高精度测量仪器被用于微观尺寸的测量,其中包括光学3D表面轮廓仪(白光干涉仪)、共聚焦显微镜和台阶仪。有效评估材料表面的微观结构和形貌…...
Rust开发环境搭建
Rust开发环境搭建 环境 rust: 1.79.0(2024-06-13)1. Rustup下载器在线安装 windows: https://static.rust-lang.org/rustup/dist/x86_64-pc-windows-msvc/rustup-init.exe unix: curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh2. R…...
图文识别0难度上手~基于飞浆对pdf简易ocr并转txt
前言 本篇pdf适用windows对视觉识别0基础的的纯小白用户。大佬请绕道~~ 注意: 本项目pdf的ocr对于表格、画图文字,水印等干扰没做任何处理,因此希望各位使用该功能的pdf尽量不要含有这些干扰项,以免影响翻译效果。 流程 1.构建…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
