2024年150道高频Java面试题(二十)
39. 说一下 HashMap 的实现原理?
HashMap 是 Java 中使用非常普遍的一种基于散列的映射数据结构,主要用于存储键值对。它允许使用任何非空对象作为键和值,主要实现原理如下:
- 数组 + 链表 + 红黑树:HashMap 内部主要由一个数组构成,每个数组元素是一个链表或红黑树,链表或红黑树用于存储具有相同散列码的键值对。
- 散列函数:当向 HashMap 中插入一个键值对时,首先会使用散列函数计算键的散列码,散列码决定了键值对在数组中的位置。
- 索引计算:通过散列码与数组长度的模运算(散列码 % 数组长度)得到该键值对应在数组中的索引位置。
- 链表和红黑树:如果两个不同的键具有相同的散列码,它们会被存储在同一个数组索引位置对应的链表中。如果链表长度过长(默认超过8),则会转换为红黑树,以减少搜索时间。
- 键的唯一性:HashMap 中键的唯一性是通过 equals() 方法和 hashCode() 方法来保证的。如果两个键的 hashCode() 返回相同的值,并且 equals() 也返回 true,则认为这两个键是相同的。
- 扩容机制:当 HashMap 中的元素数量达到一定的阈值(容量*加载因子,默认加载因子是 0.75),HashMap 会进行扩容,即创建一个新的更大的数组,并将旧数组的内容重新计算索引并复制到新数组中,这个过程称为“rehash”。
以下是一个简化的 HashMap 插入操作代码示例:
public V put(K key, V value) {if (key == null)return putForNullKey(value); // 键为null时特殊处理int hash = hash(key.hashCode()); // 计算散列码int i = indexFor(hash, table.length); // 计算索引位置for (Entry<K,V> e = table[i]; e != null; e = e.next) {Object k;if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {V oldValue = e.value;e.value = value;return oldValue;}}addEntry(hash, key, value, i); // 添加新条目return null;
}
上述代码简化了实际的实现,但基本展示了 HashMap 的插入过程,包括散列计算、查找链表、替换旧值或添加新节点等步骤。
40. 说一下 HashSet 的实现原理?
HashSet 是 Java 中集合框架的一部分,实现了 Set 接口。它基于 HashMap 实现,用于存储无序且不重复的元素集合。以下是 HashSet 的实现原理:
- 存储结构:
HashSet内部使用HashMap来存储元素。在HashMap中,元素以键值对(Entry)的形式存储,其中键就是我们要存储的元素本身,而值则是一个固定的常量。 - 哈希函数:当向
HashSet添加一个元素时,会使用这个元素自身的hashCode()方法来计算它的哈希值,并通过这个哈希值来确定在哈希表中的存储位置。 - 碰撞处理:如果两个不同的元素具有相同的哈希值(即发生了哈希碰撞),
HashSet会利用链表(在 JDK8 中,当链表长度超过一定阈值时,会转换为红黑树)来处理这种情况。在链表或红黑树中,元素按照插入顺序进行存储。 - 唯一性保证:对于每个要添加的元素,
HashSet不仅仅检查其哈希值,还会调用元素的equals()方法来确保没有重复元素被添加。如果元素的equals()方法返回true,HashSet将不会添加这个元素。- 如果在对应位置上没有元素,直接添加。
- 如果有元素,但
equals()方法返回false,则会添加到链表或红黑树中。 - 如果有元素且
equals()方法返回true,则忽略添加操作。
以下是 HashSet 添加元素流程的简化版:
public boolean add(E e) {return map.put(e, PRESENT) == null;
}
这里的 map 是 HashSet 内部维护的 HashMap 实例,而 PRESENT 是一个静态的常量对象,作为所有键对应的值。
总结:
HashSet基于哈希表实现,提供快速的查找、添加和删除操作。- 元素的唯一性由其
hashCode()和equals()方法共同决定。 HashSet不保证元素的顺序,且迭代顺序可能会随着元素数量的变化而变化。
领【150 道精选 Java 高频面试题】请go公众号:码路向前 。
相关文章:
2024年150道高频Java面试题(二十)
39. 说一下 HashMap 的实现原理? HashMap 是 Java 中使用非常普遍的一种基于散列的映射数据结构,主要用于存储键值对。它允许使用任何非空对象作为键和值,主要实现原理如下: 数组 链表 红黑树:HashMap 内部主要由一…...
Docker-Compose容器编排
基本介绍 使用一个Dockerfile模板文件,可以很方便的定义一个适合自己使用的自定义镜像。但在工作中经常会碰到需要多个容器相互配合来完成某项任务或运行某个项目的情况。例如要运行一个django项目,除了django容器本身,往往还需要再加上…...
nvm 安装多个版本的Node npm
先安装nvm 管理工具 git安装地址 找到安装包 下载然后安装 https://github.com/coreybutler/nvm-windows/releases/tag/1.1.11nvm常用命令 命令说明nvm version查看nvm版本nvm ls查看所有已经安装的Nodejs版本nvm list installed查看所有已经安装的Nodejs版本nvm ls availab…...
RisingWave 在品高股份 Bingo IAM 中的应用
背景介绍 公司背景 品高股份,是国内专业的云计算及行业信息化服务提供商。公司成立于 2003 年,总部位于广州,下设多家子公司和分公司,目前员工总数近 900 人,其中 80 %以上是专业技术人员。 品高股份在 2008 年便开…...
.Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
.Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置 没有废话,直接上代码调用 没有废话,直接上代码 /// <summary>/// 启动类/// </summary>public static class Mains{static IServiceCollection _services;static IMvcBuilder _…...
尚硅谷2024最新Git企业实战教程 | Git与GitLab的企业实战
这篇博客是尚硅谷2024最新Git企业实战教程,全方位学习git与gitlab的完整笔记。 这不仅仅是一套Git的入门教程,更是全方位的极狐GitLab企业任务流开发实战!作为一应俱全的一站式DevOps平台,极狐GitLab的高阶功能全面覆盖࿰…...
2024阿里云老用户服务器优惠价格99元和199元
阿里云服务器租用价格表2024年最新,云服务器ECS经济型e实例2核2G、3M固定带宽99元一年,轻量应用服务器2核2G3M带宽轻量服务器一年61元,ECS u1服务器2核4G5M固定带宽199元一年,2核4G4M带宽轻量服务器一年165元12个月,2核…...
【前端webpack5高级优化】提升打包构建速度几种优化方案
HotModuleReplacement(HMR/热模块替换) 开发时我们修改了其中一个模块代码,Webpack 默认会将所有模块全部重新打包编译,速度很慢 所以我们需要做到修改某个模块代码,就只有这个模块代码需要重新打包编译,…...
【第十一届大唐杯全国大学生新一代信息通信技术大赛】赛题分析
赛道一 一等奖 7% 二等奖 15% 三等奖 25% 赛道二 参考文档: 《第十一届大唐杯全国大学生新一代信息通信技术大赛(产教融合5G创新应用设计)专项赛说明.pdf》 一等奖:7% 二等奖:10% 三等奖:20% 赛项一&am…...
Java面试题:Java集合框架:请简述Java集合框架的主要组成部分,并解释它们之间的关系。
Java集合框架(Java Collections Framework)是一组用来表示和操作集合的类的集合,它提供了用于存储不同类型对象的标准化接口和类。Java集合框架的主要组成部分包括以下几个部分: 集合接口(Collection Interface&#…...
hadoop3.0高可用分布式集群安装
hadoop高可用,依赖于zookeeper。 用于生产环境, 企业部署必须的模式. 1. 部署环境规划 1.1. 虚拟机及hadoop角色划分 主机名称 namenode datanode resourcemanager nodemanager zkfc journalnode zookeeper master slave1 slave2 1.2. 软件版本 java …...
Flink SQL系列之:解析Debezium数据格式时间字段常用的函数
Flink SQL系列之:解析Debezium数据格式时间字段常用的函数 一、FROM_UNIXTIME二、DATE_FORMAT三、TO_DATE四、CAST五、TO_TIMESTAMP_LTZ六、CONVERT_TZ七、FROM_UNIXTIME八、TO_TIMESTAMP九、常见用法案例1.案例一2.案例二3.案例三4.案例四5.案例五...
Redis底层数据结构-Dict
1. Dict基本结构 Redis的键与值的映射关系是通过Dict来实现的。 Dict是由三部分组成,分别是哈希表(DictHashTable),哈希节点(DictEntry),字典(Dict) 哈希表结构如下图所…...
Python基于深度学习的人脸识别项目源码+演示视频,利用OpenCV进行人脸检测与识别 preview
一、原理介绍 该人脸识别实例是一个基于深度学习和计算机视觉技术的应用,主要利用OpenCV和Python作为开发工具。系统采用了一系列算法和技术,其中包括以下几个关键步骤: 图像预处理:首先,对输入图像进行预处理&am…...
CTF下加载CTFtraining题库以管理员身份导入 [HCTF 2018]WarmUp,之后以参赛者身份完成解题全过程
-------------------搭建CTFd------------------------------ 给大家介绍一个本地搭建比较好用的CTF比赛平台:CTFD。 CTFd是一个Capture The Flag框架,侧重于易用性和可定制性。它提供了运行CTF所需的一切,并且可以使用插件和主题轻松进行自…...
机器学习每周挑战——信用卡申请用户数据分析
数据集的截图 # 字段 说明 # Ind_ID 客户ID # Gender 性别信息 # Car_owner 是否有车 # Propert_owner 是否有房产 # Children 子女数量 # Annual_income 年收入 # Type_Income 收入类型 # Education 教育程度 # Marital_status 婚姻状况 # Housing_type 居住…...
Vulnhub:WESTWILD: 1.1
目录 信息收集 arp nmap nikto whatweb WEB web信息收集 dirmap enm4ulinux sumbclient get flag1 ssh登录 提权 横向移动 get root 信息收集 arp ┌──(root㉿ru)-[~/kali/vulnhub] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 0…...
[C#]winform使用OpenCvSharp实现透视变换功能支持自定义选位置和删除位置
【透视变换基本原理】 OpenCvSharp 是一个.NET环境下对OpenCV原生库的封装,它提供了大量的计算机视觉和图像处理的功能。要使用OpenCvSharp实现透视变换(Perspective Transformation),你首先需要理解透视变换的原理和它在图像处理…...
C++——list类及其模拟实现
前言:这篇文章我们继续进行C容器类的分享——list,也就是数据结构中的链表,而且是带头双向循环链表。 一.基本框架 namespace Mylist {template<class T>//定义节点struct ListNode{ListNode<T>* _next;ListNode<T>* _pre…...
https访问http的minio 图片展示不出来
问题描述:请求到的图片地址单独访问能显示,但是在网页中展示不出来 原因:https中直接访问http是不行的,需要用nginx再转发一下 nginx配置如下(注意:9000是minio默认端口,已经占用,…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...
系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...
人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型
在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型。这些平台各有侧重,适用场景差异显著。下面我将从核心功能定位、典型应用场景、真实体验痛点、选型决策关键点进行拆解,并提供具体场景下的推荐方案。 一、核心功能定位速览 平台核心定位技术栈亮…...
快速排序算法改进:随机快排-荷兰国旗划分详解
随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...
加密通信 + 行为分析:运营商行业安全防御体系重构
在数字经济蓬勃发展的时代,运营商作为信息通信网络的核心枢纽,承载着海量用户数据与关键业务传输,其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级,传统安全防护体系逐渐暴露出局限性&a…...
怎么开发一个网络协议模块(C语言框架)之(六) ——通用对象池总结(核心)
+---------------------------+ | operEntryTbl[] | ← 操作对象池 (对象数组) +---------------------------+ | 0 | 1 | 2 | ... | N-1 | +---------------------------+↓ 初始化时全部加入 +------------------------+ +-------------------------+ | …...
