【Java面试八股文宝典之基础篇】备战2023 查缺补漏 你越早准备 越早成功!!!——Day12

news2025/1/12 21:00:03

  大家好,我是陶然同学,软件工程大三明年实习。认识我的朋友们知道,我是科班出身,学的还行,但是对面试掌握不够,所以我将用这100多天更新Java面试题🙃🙃。

  不敢苟同,相信大家和我一样,都有一个大厂梦,作为一名资深Java选手,深知面试重要性,接下来我准备用100天时间,基于Java岗面试中的高频面试题,以每日3题的形式,带你过一遍热门面试题及恰如其分的解答。当然,我不会太深入,因为我怕记不住!!

  因此,不足的地方希望各位在评论区补充疑惑、见解以及面试中遇到的奇葩问法,希望这100天能够让我们有质的飞越,一起冲进大厂!!,让我们一起学(juan)起来!!!

谈谈Concurrent(可考润s)HashMap的扩容机制

1.7版本
1. 1.7版本的ConcurrentHashMap是基于Segment(色们)分段实现的
2. 每个Segment相对于⼀个⼩型的HashMap
3. 每个Segment内部会进⾏扩容,和HashMap的扩容逻辑类似
4. 先⽣成新的数组,然后转移元素到新数组中
5. 扩容的判断也是每个Segment内部单独判断的,判断是否超过阈值
1.8版本
1. 1.8版本的ConcurrentHashMap不再基于Segment实现
2. 当某个线程进⾏put时,如果发现ConcurrentHashMap正在进⾏扩容那么该线程⼀起进⾏扩容
3. 如果某个线程put时,发现没有正在进⾏扩容,则将key-value添加到ConcurrentHashMap中,然
后判断是否超过阈值,超过了则进⾏扩容
4. ConcurrentHashMap是⽀持多个线程同时扩容的
5. 扩容之前也先⽣成⼀个新的数组
6. 在转移元素时,先将原数组分组,将每组分给不同的线程来进⾏元素的转移,每个线程负责⼀组
或多组的元素转移⼯作

Jdk1.7到Jdk1.8 HashMap 发⽣了什么变化(底层)?

1. 1.7中底层是数组+链表,1.8中底层是数组+链表+红⿊树,加红⿊树的⽬的是提⾼HashMap插⼊
和查询整体效率
2. 1.7中链表插⼊使⽤的是头插法,1.8中链表插⼊使⽤的是尾插法,因为1.8中插⼊key和value时
需要判断链表元素个数,所以需要遍历链表统计链表元素个数,所以正好就直接使⽤尾插法
3. 1.7中哈希算法⽐较复杂,存在各种右移与异或运算,1.8中进⾏了简化,因为复杂的哈希算法的
⽬的就是提⾼散列性,来提供HashMap的整体效率,⽽1.8中新增了红⿊树,所以可以适当的简化
哈希算法,节省CPU资源

说⼀下HashMap的Put⽅法

先说HashMap的Put⽅法的⼤体流程:
1. 根据Key通过哈希算法与与运算得出数组下标
2. 如果数组下标位置元素为空,则将key和value封装为Entry对象(
JDK1.7中是Entry对象,JDK1.8中是Node对象)并放⼊该位置
3. 如果数组下标位置元素不为空,则要分情况讨论
a. 如果是JDK1.7,则先判断是否需要扩容,如果要扩容就进⾏扩容,如果不⽤扩容就⽣成Entry
对象,并使⽤头插法添加到当前位置的链表中
b. 如果是JDK1.8,则会先判断当前位置上的Node的类型,看是红⿊树Node,还是链表Node
ⅰ. 如果是红⿊树Node,则将key和value封装为⼀个红⿊树节点并添加到红⿊树中去,在这个
过程中会判断红⿊树中是否存在当前key,如果存在则更新value
ⅱ. 如果此位置上的Node对象是链表节点,则将key和value封装为⼀个链表Node并通过尾插
法插⼊到链表的最后位置去,因为是尾插法,所以需要遍历链表,在遍历链表的过程中会
判断是否存在当前key,如果存在则更新value,当遍历完链表后,将新链表Node插⼊到链
表中,插⼊到链表后,会看当前链表的节点个数,如果⼤于等于8,那么则会将该链表转
成红⿊树
ⅲ. 将key和value封装为Node插⼊到链表或红⿊树中后,再判断是否需要进⾏扩容,如果需要
就扩容,如果不需要就结束PUT⽅法

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

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

相关文章

论文投稿指南——中文核心期刊推荐(电子、通信技术3)

【前言】 🚀 想发论文怎么办?手把手教你论文如何投稿!那么,首先要搞懂投稿目标——论文期刊 🎄🎈 核心期刊在国内的应用范围非常广,核心期刊发表很多是国内作者晋升中的硬性要求,在…

java计算机毕业设计ssm新文道考研机构在线教学辅导系统tjv50(附源码、数据库)

java计算机毕业设计ssm新文道考研机构在线教学辅导系统tjv50(附源码、数据库) 项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都…

Zebec获BNB Chain生态大力支持,ZBC通证将陆续登录一线平台

在行业早期开始,流支付赛道就已经具备了早期的轮廓,而在流支付协议Zebec Protocol出现后,该领域被推向了一个新的发展高度,并得到加密领域以及传统商业领域的高度关注。而随着生态的商业进展不断推进、生态不断壮大,Ze…

解决 PHPMYADMIN 无法导入大数据库文件方法

有个运营多年的海外站点需要搬迁服务器,备份好数据库后,通过 phpmyAdmin 面板导入数据库时发现有文件大小限制,最大导入 100M 的数据库文件,自己的数据库备份文件足足有 175M,平时都是通过 Navicat 导入也没注意,刚好遇见问题那么就选择解决问题。 解决方法 1、在 phpM…

docker构建vue项目镜像并发布到dockerhub中使用

先将本地vue项目打包为一个镜像,不会的可以看文章:使用docker构建vue项目并成功运行在本地和线上_1024小神的博客-CSDN博客 然后开始注册一个dockerhub账号并登陆:然后点击 create repository Docker Hub 开始填写仓库名称和描述&#xff1…

什么是WMS?有哪些好用的wms仓库管理系统推荐?

通过本篇文章,您将了解以下问题:1、WMS是什么?使用价值有哪些 2、国内有哪些好用的WMS仓库管理系统推荐? 一、WMS是什么? WMS是仓库管理系统(Warehouse Management System) 的缩写。WMS仓库管理系统综合了产品的入库、…

关于 ABAP 开发对象的原始语言版本(Original Language)

当创建新的存储库对象时,例如 ABAP 词典中的程序、类或数据库表,必须指定其原始语言。ABAP 开发框架隐式将当前登录语言设置为其原始语言。 作为开发项目中开发对象的一部分创建的所有可翻译文本(包括描述性短文本和长文本、程序的文本元素以…

uni-app DAY08

复习: 1、uni-app中常用组件 ①内置组件:页面(page)、视图(view)、滚动视图(scroll-view)、文本(text)、富文本(rich-text)、图片(image)、输入框(input)、按钮(button)、导航器/超链接(navigator)、轮播(swiper)、拾取器/下拉菜单/选择器(picker)、单…

云弹性:它如何影响云计算?

云弹性是云计算最重要的特性之一。云弹性是指云提供商根据企业流程的需求向该流程提供资源的过程。云提供商拥有自动交付或删除资源的系统,以便为每个项目提供适当数量的资产。对于云用户来说,他们将被赋予足够的权力来运行他们的工作流,而不…

Java高级——Graal编译器介绍

Graal编译器介绍 Graal编译器由Java实现,支持提前编译和即时编译 JDK9推出Java虚拟机编译器接口(Java-Level JVM CompilerInterface,JVMCI),将Graal从HotSpot代码中独立出来(即可外部挂载) 构…

Klarf 文件可视化工具

1.技术框架 1.1 前端: Vue3 网页版Electron Quasar 可生成 EXE、APK 等客户端Element-Plus 控件axios 跨域 1.2 后端: Flask 提供接口 2. Web 版和客户端版 2.1 Web 版页面 2.2 客户端界面 2.3 使用流程 在 SenseTools-Klarf-Parser/data/test_f…

小程序开发,低成本运营教程

近年来,小程序DAU呈现出爆发式增长的趋势,相比app来说它具有一定的优势,不占用手机内存,在应用内就可使用,对用户来说非常便利。 另外,由于小程序的开发门槛和成本都比较低,企业还能依托平台获…

ImmunoChemistry丨ICT艾美捷ELISA平板盖说明书

使用ImmunoChemistry艾美捷ELISA平板盖减少样品蒸发并防止免疫测定培养期间的污染。ELISA平板盖是透明的粘性塑料片,用于在培养分析时覆盖和密封微量滴定板孔。 ImmunoChemistry Technologies简称"ICT",研究工具众多,包含细胞蛋白酶、细胞凋亡…

【MyBatis】订单商品数据模型分析

1. 数据模型分析思路 每张表记录的数据内容 分模块对每张表记录的内容进行熟悉,相当于你学习系统需求(功能)的过程。 每张表重要的字段设置 非空字段、外键字段 数据库级别表与表之间的关系 外键关系 表与表之间的业务关系 在分析表与表之…

【环境配置】使用Docker搭建LAMP环境

这篇文章不是介绍DOCKER是什么,也不是阐述DOCKER的核心:镜像/容器和仓库之间的关系,它只是一篇让刚刚接触DOCKER的初学者,在没有完全了解DOCKER是什么之前,也能尽快的在Linux系统下面通过DOCKER来搭建一个LAMP环境,这是其一&#…

【代码审计-PHP】基于Thinkphp框架开发的

目录 一、Thinkphp基本结构 1、框架目录 2、判断框架、版本 3、入口文件 4、资源文件 5、调试开关 6、URL路由 二、基本函数 1、请求 2、交互: 3、响应: 三、危险函数 四、已有漏洞 五、漏洞检测工具 六、工具 一、Thinkphp基本结构 1、框…

Django笔记

Cookie中的数据是由键值对构成,每一个cookie就是一个键值对;Cookie拥有有效期: max_age(单位是秒)就用来决定 Cookie 的有效期;path决定Cookie的有效范围(当path为"/"时,即…

跟我学Python图像处理丨带你入门OpenGL

摘要:介绍Python和OpenGL的入门知识,包括安装、语法、基本图形绘制等。本文分享自华为云社区《[Python图像处理] 二十七.OpenGL入门及绘制基本图形(一)》,作者:eastmount。 一.OpenGL入门知识 1.什么是Op…

冬季,该如何对扬尘进行管理?

冬季降水少,大风天气多,如今随着各个城市的全面放开,城区里面车辆来来往往更多,所以非常容易产生道路扬尘污染。扬尘污染不仅会降低空气质量,影响居民的正常出行,而且还会对人们的身体尤其是呼吸系统产生健…

Java 注解(Annotation)(上)

Java 注解(Annotation) Java 语言中的类、方法、变量、参数和包等都可以被标注。和 Javadoc 不同,Java 标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java 虚拟机可以保留标注内容&#xff0c…