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

2024年150道高频Java面试题(二十)

39. 说一下 HashMap 的实现原理?

HashMap 是 Java 中使用非常普遍的一种基于散列的映射数据结构,主要用于存储键值对。它允许使用任何非空对象作为键和值,主要实现原理如下:

  1. 数组 + 链表 + 红黑树:HashMap 内部主要由一个数组构成,每个数组元素是一个链表或红黑树,链表或红黑树用于存储具有相同散列码的键值对。
  2. 散列函数:当向 HashMap 中插入一个键值对时,首先会使用散列函数计算键的散列码,散列码决定了键值对在数组中的位置。
  3. 索引计算:通过散列码与数组长度的模运算(散列码 % 数组长度)得到该键值对应在数组中的索引位置。
  4. 链表和红黑树:如果两个不同的键具有相同的散列码,它们会被存储在同一个数组索引位置对应的链表中。如果链表长度过长(默认超过8),则会转换为红黑树,以减少搜索时间。
  5. 键的唯一性:HashMap 中键的唯一性是通过 equals() 方法和 hashCode() 方法来保证的。如果两个键的 hashCode() 返回相同的值,并且 equals() 也返回 true,则认为这两个键是相同的。
  6. 扩容机制:当 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 的实现原理:

  1. 存储结构HashSet 内部使用 HashMap 来存储元素。在 HashMap 中,元素以键值对(Entry)的形式存储,其中键就是我们要存储的元素本身,而值则是一个固定的常量。
  2. 哈希函数:当向 HashSet 添加一个元素时,会使用这个元素自身的 hashCode() 方法来计算它的哈希值,并通过这个哈希值来确定在哈希表中的存储位置。
  3. 碰撞处理:如果两个不同的元素具有相同的哈希值(即发生了哈希碰撞),HashSet 会利用链表(在 JDK8 中,当链表长度超过一定阈值时,会转换为红黑树)来处理这种情况。在链表或红黑树中,元素按照插入顺序进行存储。
  4. 唯一性保证:对于每个要添加的元素,HashSet 不仅仅检查其哈希值,还会调用元素的 equals() 方法来确保没有重复元素被添加。如果元素的 equals() 方法返回 trueHashSet 将不会添加这个元素。
    • 如果在对应位置上没有元素,直接添加。
    • 如果有元素,但 equals() 方法返回 false,则会添加到链表或红黑树中。
    • 如果有元素且 equals() 方法返回 true,则忽略添加操作。

以下是 HashSet 添加元素流程的简化版:

public boolean add(E e) {return map.put(e, PRESENT) == null;
}

这里的 mapHashSet 内部维护的 HashMap 实例,而 PRESENT 是一个静态的常量对象,作为所有键对应的值。

总结:

  • HashSet 基于哈希表实现,提供快速的查找、添加和删除操作。
  • 元素的唯一性由其 hashCode()equals() 方法共同决定。
  • HashSet 不保证元素的顺序,且迭代顺序可能会随着元素数量的变化而变化。

领【150 道精选 Java 高频面试题】请go公众号:码路向前 。

相关文章:

2024年150道高频Java面试题(二十)

39. 说一下 HashMap 的实现原理&#xff1f; HashMap 是 Java 中使用非常普遍的一种基于散列的映射数据结构&#xff0c;主要用于存储键值对。它允许使用任何非空对象作为键和值&#xff0c;主要实现原理如下&#xff1a; 数组 链表 红黑树&#xff1a;HashMap 内部主要由一…...

Docker-Compose容器编排

​ 基本介绍 使用一个Dockerfile模板文件&#xff0c;可以很方便的定义一个适合自己使用的自定义镜像。但在工作中经常会碰到需要多个容器相互配合来完成某项任务或运行某个项目的情况。例如要运行一个django项目&#xff0c;除了django容器本身&#xff0c;往往还需要再加上…...

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 中的应用

背景介绍 公司背景 品高股份&#xff0c;是国内专业的云计算及行业信息化服务提供商。公司成立于 2003 年&#xff0c;总部位于广州&#xff0c;下设多家子公司和分公司&#xff0c;目前员工总数近 900 人&#xff0c;其中 80 %以上是专业技术人员。 品高股份在 2008 年便开…...

.Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置

.Net Core/.Net6/.Net8 &#xff0c;启动配置/Program.cs 配置 没有废话&#xff0c;直接上代码调用 没有废话&#xff0c;直接上代码 /// <summary>/// 启动类/// </summary>public static class Mains{static IServiceCollection _services;static IMvcBuilder _…...

尚硅谷2024最新Git企业实战教程 | Git与GitLab的企业实战

这篇博客是尚硅谷2024最新Git企业实战教程&#xff0c;全方位学习git与gitlab的完整笔记。 这不仅仅是一套Git的入门教程&#xff0c;更是全方位的极狐GitLab企业任务流开发实战&#xff01;作为一应俱全的一站式DevOps平台&#xff0c;极狐GitLab的高阶功能全面覆盖&#xff0…...

2024阿里云老用户服务器优惠价格99元和199元

阿里云服务器租用价格表2024年最新&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元&#xff0c;ECS u1服务器2核4G5M固定带宽199元一年&#xff0c;2核4G4M带宽轻量服务器一年165元12个月&#xff0c;2核…...

【前端webpack5高级优化】提升打包构建速度几种优化方案

HotModuleReplacement&#xff08;HMR/热模块替换&#xff09; 开发时我们修改了其中一个模块代码&#xff0c;Webpack 默认会将所有模块全部重新打包编译&#xff0c;速度很慢 所以我们需要做到修改某个模块代码&#xff0c;就只有这个模块代码需要重新打包编译&#xff0c;…...

【第十一届大唐杯全国大学生新一代信息通信技术大赛】赛题分析

赛道一 一等奖 7% 二等奖 15% 三等奖 25% 赛道二 参考文档&#xff1a; 《第十一届大唐杯全国大学生新一代信息通信技术大赛&#xff08;产教融合5G创新应用设计&#xff09;专项赛说明.pdf》 一等奖&#xff1a;7% 二等奖&#xff1a;10% 三等奖&#xff1a;20% 赛项一&am…...

Java面试题:Java集合框架:请简述Java集合框架的主要组成部分,并解释它们之间的关系。

Java集合框架&#xff08;Java Collections Framework&#xff09;是一组用来表示和操作集合的类的集合&#xff0c;它提供了用于存储不同类型对象的标准化接口和类。Java集合框架的主要组成部分包括以下几个部分&#xff1a; 集合接口&#xff08;Collection Interface&#…...

hadoop3.0高可用分布式集群安装

hadoop高可用&#xff0c;依赖于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是由三部分组成&#xff0c;分别是哈希表&#xff08;DictHashTable&#xff09;&#xff0c;哈希节点&#xff08;DictEntry&#xff09;&#xff0c;字典&#xff08;Dict&#xff09; 哈希表结构如下图所…...

Python基于深度学习的人脸识别项目源码+演示视频,利用OpenCV进行人脸检测与识别 preview

​ 一、原理介绍 该人脸识别实例是一个基于深度学习和计算机视觉技术的应用&#xff0c;主要利用OpenCV和Python作为开发工具。系统采用了一系列算法和技术&#xff0c;其中包括以下几个关键步骤&#xff1a; 图像预处理&#xff1a;首先&#xff0c;对输入图像进行预处理&am…...

CTF下加载CTFtraining题库以管理员身份导入 [HCTF 2018]WarmUp,之后以参赛者身份完成解题全过程

-------------------搭建CTFd------------------------------ 给大家介绍一个本地搭建比较好用的CTF比赛平台&#xff1a;CTFD。 CTFd是一个Capture The Flag框架&#xff0c;侧重于易用性和可定制性。它提供了运行CTF所需的一切&#xff0c;并且可以使用插件和主题轻松进行自…...

机器学习每周挑战——信用卡申请用户数据分析

数据集的截图 # 字段 说明 # 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原生库的封装&#xff0c;它提供了大量的计算机视觉和图像处理的功能。要使用OpenCvSharp实现透视变换&#xff08;Perspective Transformation&#xff09;&#xff0c;你首先需要理解透视变换的原理和它在图像处理…...

C++——list类及其模拟实现

前言&#xff1a;这篇文章我们继续进行C容器类的分享——list&#xff0c;也就是数据结构中的链表&#xff0c;而且是带头双向循环链表。 一.基本框架 namespace Mylist {template<class T>//定义节点struct ListNode{ListNode<T>* _next;ListNode<T>* _pre…...

https访问http的minio 图片展示不出来

问题描述&#xff1a;请求到的图片地址单独访问能显示&#xff0c;但是在网页中展示不出来 原因&#xff1a;https中直接访问http是不行的&#xff0c;需要用nginx再转发一下 nginx配置如下&#xff08;注意&#xff1a;9000是minio默认端口&#xff0c;已经占用&#xff0c;…...

【Python整理】 Python知识点复习

1.Python中__init__()中声明变量必须都是self吗? 在Python中的类定义里&#xff0c;init() 方法是一个特殊的方法&#xff0c;称为类的构造器。在这个方法中&#xff0c;通常会初始化那些需要随着对象实例化而存在的实例变量。使用 self 是一种约定俗成的方式来引用实例本身。…...

汽车电子行业知识:UWB技术及应用

文章目录 1.什么是UWB技术1.1.UWB测距原理1.2.UWB数据传输原理2.汽车UWB技术应用2.1.UWB雷达2.1.1.信道的冲击响应CIR2.2.舱外检测目标2.3.舱内检测活体2.3.1.活体检测原理2.4.脚踢尾箱开门2.4.1.脚踢检测原理1.什么是UWB技术 UWB(ultra wideband)也叫超宽带技术,是一种使用…...

Claude-3全解析:图片问答,专业写作能力显著领先GPT-4

人工智能技术的飞速发展正在深刻改变着我们的工作和生活方式。作为一名资深的技术爱好者&#xff0c;我最近有幸体验了备受瞩目的AI助手Claude-3。这款由Anthropic公司推出的新一代智能工具展现出了非凡的实力&#xff0c;尤其在图像识别和专业写作领域的表现更是让人眼前一亮&…...

Mac 如何彻底卸载Python 环境?

第一步&#xff1a;首先去应用程序文件夹中&#xff0c;删除关于Python的所有文件&#xff1b; 第二步&#xff1a;打开terminal终端&#xff0c;输入下面命令查看versions下有哪些python版本&#xff1b; ls /library/frameworks/python.framework/versions第三步&#xff1…...

Vue 大文件切片上传实现指南包会,含【并发上传切片,断点续传,服务器合并切片,计算文件MD5,上传进度显示,秒传】等功能

Vue 大文件切片上传实现指南 背景 在Web开发中&#xff0c;文件上传是一个常见的功能需求&#xff0c;尤其是当涉及到大文件上传时&#xff0c;为了提高上传的稳定性和效率&#xff0c;文件切片上传技术便显得尤为重要。通过将大文件切分成多个小块&#xff08;切片&#xff0…...

【VUE+ElementUI】el-table表格固定列el-table__fixed导致滚动条无法拖动

【VUEElementUI】el-table表格固定列el-table__fixed导致滚动条无法拖动 背景 当设置了几个固定列之后&#xff0c;表格无数据时&#xff0c;点击左侧滚动条却被遮挡&#xff0c;原因是el-table__fixed过高导致的 解决 在index.scss中直接加入以下代码即可 /* 设置默认高…...

重置gitlab root密码

gitlab-rails console -e production user User.where(id: 1).first user User.where(name: "root").first #输入重置密码命令 user.password"admin123!" #再次确认密码 user.password_confirmation"admin123!" #输入保存命令&am…...

v-text 和v-html

接下来&#xff0c;我讲介绍一下v-text和v-html的使用方式以及它们之间的区别。 使用方法 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-widt…...

学习笔记——C语言基本概念结构体共用体枚举——(10)

1、结构体 定义新的数据类型&#xff1a; 数据类型&#xff1a;char short int long float double 数组 指针 结构体 结构体&#xff1a; 新的自己定义的数据类型 格式&#xff1a; struct 名字{ 成员 1&#xff1b; 成员 2&#xff1b; 。 。 。 …...

VMware虚拟机三种网络模式

VMware虚拟机提供了三种主要的网络连接模式&#xff0c;它们分别是&#xff1a; 桥接模式&#xff08;Bridged Mode&#xff09;网络地址转换模式&#xff08;NAT Mode&#xff09;仅主机模式&#xff08;Host-Only Mode&#xff09; 1. 桥接模式&#xff08;Bridged Mode&am…...

手机网站app制作/天津百度推广电话号码

修复此问题 禁用内核调试&#xff0c;在 Visual Studio 中调试。- 或 -使用内核调试器而不是 Visual Studio 进行调试。- 或 -在内核调试器中禁用用户模式异常。在当前会话中禁用内核调试 在命令提示处&#xff0c;键入&#xff1a; 复制代码 Kdbgctrl.exe -d对所有会话禁用内核…...

网站伪静态/西安企业网站seo

&#xfeff;&#xfeff;Activity、Service和线程应该是Android编程中最常见的几种类了&#xff0c;几乎大多数应用程序都会涉及到这几个类的编程&#xff0c;自然而然的&#xff0c;也就会涉及到三者之间的相互通信&#xff0c;本文就试图简单地介绍一下这三者通信的方式。想…...

即墨网站建设公司/武汉seo招聘网

text...........................

b2c商城网站开发价格/目前最流行的拓客方法

一致性Hash算法普通余数Hash算法与一致性Hash算法的区别&#xff0c;一致性Hash算法解决了什么问题&#xff1f;普通余数Hash算法我们前面研究Memcache&#xff08;mc&#xff09;与Redis的区别时&#xff0c;分析到mc是通过客户端来实现服务集群高可用的&#xff0c;客户端会有…...

数字尾巴+wordpress/互联网培训机构排名前十

查找题目描述&#xff1a;输入数组长度 n输入数组 a[1...n]输入查找个数m输入查找数字b[1...m]输出 YES or NO 查找有则YES 否则NO 。输入&#xff1a;输入有多组数据。每组输入n&#xff0c;然后输入n个整数&#xff0c;再输入m&#xff0c;然后再输入m个整数(1<m<n<…...

网站开发需要用到哪些技术/汕头seo排名收费

问题:当使用命令提示符时,错误:非法注册类别答案:这个错误可能是因为WMI组件的丢失或不正确注册所致.WMI会调用%windir%\system32\wbem文件夹下的DLL文件.为了注册WMI组件,请在下列命令提示符中运行下面的命令.cd /d %windir%\system32\wbemfor %i in (*.dll) do RegSvr32 -s %…...