20230913java面经整理

news2025/1/23 22:38:30

1.hashmap为什么重写hashcode必须重写equals?不重写hashcode?

hashcode判断对象存放的索引值,equals判断相同索引下对象是否相同,不同则存放(链表)
hashcode提升查询效率,通过哈希计算,equals相等hashcode一定 相等
因为业务判断equals不一定严格对象相等,所以要重写equals
规定:equals的对象必须有相同的hashcode
不重写的话导致hashmap不可以正常运作

2.concurrenthashmap数据结构,怎么实现线程安全?

hashmap在多线程put的时候,hash碰撞时通过链表方式存,没有同步的话可能会覆盖造成数据丢失
在这里插入图片描述
volatile:改动val和next对于其他线程都可见
cas:put的时候,根据key的hashcode定位,定位完之后时null需要使用cas进行插入,compareAndSwap
synchronized:头节点不是null,synchronized加锁头节点
在这里插入图片描述

3.reentranlock介绍一下,怎么实现

基于AQS实现:同步队列和条件队列的抽象类
同步双向链表,条件单项链表,存的等待状态的线程,aqs管理线程之间的等待状态-唤醒的工作
同步队列有独占模式和共享模式,区别在于是不是传递唤醒
定义锁:继承aqs后重写获取锁、释放锁以及管理state
reentranlock:通过重写tryAcquire和tryRelease实现lock和unlock
在这里插入图片描述
独占锁、悲观锁,默认非公平锁
lock通过cas设置state
公平锁按照同步队列中的先到先得的顺序,后来的不能抢先获得锁;非公平的如果看到state是0直接抢占
tryRelease看是否有重入,知道释放完state=0再唤醒后继节点
tryLock在规定时间内进行循环获取锁
等待-通知机制:synchronized + object或wait+notify(notifyAll)
ReentranLock + Condition使用条件队列实现wait、notify、notifyall语义
await将同步队列转移条件队列,signal将条件队列转移同步队列,只有同步队列才可以获得锁
reentrantlock是aqs实现,synchronized是jvm实现通过monitor对象/对象头实现
在这里插入图片描述

4.synchronize怎么实现

jvm通过进入和退出monitor对象实现代码块同步,使用monitorenter和monitorexit指令实现,方法同步通过access flags后边的synchronized标识,如果有标识则持有monitor
锁优化:无锁-》偏向锁-〉轻量级锁-》重量级锁
偏向锁:只有一个线程执行
轻量级锁:多个线程交替执行未发生竞争,将对象的mark word复制到当前线程的lock record中
在这里插入图片描述

5.cas介绍一下

CAS 全称是 compare and swap,是一种用于在多线程环境下实现同步功能的机制。CAS 操作包含三个操作数 – 内存位置、预期数值和新值。CAS 的实现逻辑是将内存位置处的数值与预期数值想比较,若相等,则将内存位置处的值替换为新值。若不相等,则不做任何操作。

aba问题:对每一次cas设置版本号,atomicStampedReference可以解决aba问题
循环时间开销大:如果jvm可以支持pause可提高效率,可延迟操作
只可保证一个共享变量的原子

6.volatile原理,使用场景

使用volatile来解决共享变量可见性
1.当一个线程写一个volatile变量时,JMM会把该线程对应的本地内存中的变量值强制刷新到主内存中去;
2.这个写会操作会导致其他线程中的这个共享变量的缓存失效,要使用这个变量的话必须重新去主内存中取值。3.禁止指令重排序优化,因为在多线程不一定会正确
4.为了实现volatile的内存语义,编译器在生成字节码时,会在指令序列中插入内存屏障来禁止特定类型的处理器重排序。同时内存屏障还能保证内存的可见性
使用场景:
1.用于状态标志,指示一个重要的一次性时间
2.一次性发布,可能遇到某个对象的更新值和该对象状态的旧值同时存在,例如双重检测单例,不用volatile的话jvm进行指令重排会返回未初始化的对象
在这里插入图片描述

7.事务隔离级别

脏读:脏读指的是读到了其他事务未提交的数据,未提交意味着这些数据可能会回滚
可重复读:在一个事务内,最开始读到的数据和事务结束前的任意时刻读到的同一批数据都是一致的
不可重复读:在同一事务内,不同的时刻读到的同一批数据可能是不一样的,可能会受到其他事务的影响
幻读:针对数据插入(INSERT)操作来说的


读未提交,顾名思义,就是一个事务可以读取另一个未提交事务的数据。
读提交,顾名思义,就是一个事务要等另一个事务提交后才能读取数据。
可重复读,就是在开始读取数据(事务开启)时,不再允许修改操作
串行化,后一个事务的执行必须等待前一个事务结束


使用mvvc多版本并发控制实现可重复读,生成快照
可重复读是在事务开始的时候生成一个当前事务全局性的快照,而读提交则是每次执行语句的时候都重新生成一次快照。

8.可重复读如何阻止幻读

解决幻读用的也是锁,叫做间隙锁,MySQL 把行锁和间隙锁合并在一起,解决了并发写和幻读的问题,这个锁叫做 Next-Key锁。
next-key lock = 行锁 + 间隙锁
间隙锁是多个行组成的区间,行锁是一行
有索引的话,未插入的行以及记录两边的区间加入间隙锁
没有索引的话,为整个表加入间隙锁

9.bean的生命周期

实例化 Instantiation
属性赋值 Populate
初始化 Initialization
销毁 Destruction
在这里插入图片描述

在这里插入图片描述

10.bean如何注入值

构造函数注入、set方法注入
xml配置文件注入,注解方式@value注入
xml配置中的constructor-arg可以根据name或者index注入
xml配置中的set注入直接根据name注入
p命名空间简化set注入,普通属性or引用
c明明空间简化构造器注入,普通属性or引用

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

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

相关文章

【【萌新编写riscV之计算机体系结构之CPU 总二】】

萌新编写riscV之计算机体系结构之CPU 总二(我水平太差总结不到位) 在学习完软件是如何使用之后 我们接下来要面对的问题是 整个程序是如何运转的这一基本逻辑 中央处理器(central processing unit,CPU)的任务就是负责提取程序指令&#xff0…

2023年9月16日(星期六)骑行新海晏村

2023年9月16日 (星期六):骑行新海晏村,早8:30到9:00, 大观楼门囗集合,9:30准时出发 【因迟到者,骑行速度快者,可自行追赶偶遇。】 偶遇地点: 大观楼门囗集合,家住东,南&#xff0c…

Redis常用应用场景

Redis是一款开源的基于内存的键值存储系统,它提供了多种数据结构和丰富的功能,适用于各种不同的应用场景。以下是Redis常用的应用场景: 1.缓存:Redis最常见的用途就是作为缓存。由于Redis存储在内存中,读取速度非常快…

9.13-广读最新研究方向论文核心思路汇总

思路借鉴 GRILL: Grounded Vision-language Pre-training via Aligning Text and Image Regions 关键词: 对象文本对齐 摘要:泛化到未见过的任务是少量样本学习者在不熟悉的任务上实现更好零散视觉表现的重要能力。然而,这种泛化到视觉语言任…

通过小程序实现微信扫码授权登录,网站接入微信扫码登录功能(永久免费)

需求 网站如果想要实现微信扫码登录其实有很多种方案,常见的方案就是微信开放平台和微信公众号服务号。前者是目前大部分网站并且是微信认可的一种方式,后者是开发者发现服务号具备扫码关注后即可获取用户基本信息的能力后而开发的一种方式。 而这两者…

idea创建一个微服务项目

idea创建一个微服务项目 前提:懂得创建基于pom 的 springboot项目 1.像平时创建Maven项目一样创建一个项目 2.删掉src文件,只剩下下面的东西 3.基于这个项目创建model,model也是一个Maven项目,基于springboot mvc 都行&#xff…

openGauss学习笔记-68 openGauss 数据库管理-创建和管理普通表-向表中插入数据

文章目录 openGauss学习笔记-68 openGauss 数据库管理-创建和管理普通表-向表中插入数据68.1 背景信息68.2 操作步骤68.2.1 向表customer_t1中插入一行68.2.2 向表中插入多行68.2.3 从指定表插入数据到当前表68.2.4 删除备份表 openGauss学习笔记-68 openGauss 数据库管理-创建…

Python 图形化界面基础篇:添加复选框( Checkbutton )到 Tkinter 窗口

Python 图形化界面基础篇:添加复选框( Checkbutton )到 Tkinter 窗口 引言什么是 Tkinter 复选框( Checkbutton )?步骤1:导入 Tkinter 模块步骤2:创建 Tkinter 窗口步骤3&#xff1a…

【数据分享】2006-2021年我国城市级别的排水和污水处理相关指标(20多项指标)

《中国城市建设统计年鉴》中细致地统计了我国城市市政公用设施建设与发展情况,在之前的文章中,我们分享过基于2006-2021年《中国城市建设统计年鉴》整理的2006—2021年我国城市级别的市政设施水平相关指标、2006-2021年我国城市级别的各类建设用地面积数…

Vue3表单

文章目录 Vue3表单1. 概念2. 输入框3. 复选框4. 单选按钮5. select下拉列表5.1 下拉列表单选5.1 下拉列表多选时绑定到数组5.3 使用 v-for 循环输出选项 6. 值绑定7. 修饰符7.1 .lazy7.2 .number7.3 .trim Vue3表单 1. 概念 可以用 v-model 指令在表单 、 及 等元素上创建双向…

微信内测新功能:“微信分期”来了!

微信作为一款社交 App,早已成为了现在人们日常生活中不可缺少的一部分。 随着生态不断完善,它所涵盖的功能也是越来越多。 据镭射财经,微信近日正在测试一款名为“微信分期”的全系消费信贷产品。功能入口位于微信钱包中,资金方为…

预约微信小程序源码系统制作搭建 适用于多场景 支持万能DIY功能

分享一个预约微信小程序源码系统,适用于多种预约场景,含完整代码包前端后端详细的搭建教程,支持万能DIY功能,让你轻松开发制作一个属于自己的想要的预约小程序。 一、预约微信小程序源码系统制作搭建的基本步骤和注意事项&#xf…

【Flink实战】Flink 商品销量统计-实战Bahir Connetor实战存储 数据到Redis6.X

🚀 作者 :“大数据小禅” 🚀 文章简介 :Flink 商品销量统计-实战Bahir Connetor实战存储 数据到Redis6.X 🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬 目录导航 Flink怎么操作RedisFlink 商品销量统…

宿舍考勤安全系数?这个答案全国统一!

在现代教育和住宿管理中,确保学生或员工的宿舍考勤管理变得越来越重要。传统的考勤方法可能受到人为错误和滥用的威胁,同时也可能耗费大量时间和资源。 人脸识别技术已经在各个领域展现了强大的潜力。它不仅提高了安全性,还改善了考勤管理的效…

GP08|财务估值因子过滤实盘小市值

量化策略开发,高质量社群,交易思路分享等相关内容 大家好,今天我们来分享gp08策略。千呼万唤始出来,由于xxx原因(不便说,好奇的可以私聊我),我们从9月份开始,后面分享的策…

深入解析顺序表:揭开数据结构的奥秘,掌握顺序表的精髓

💓 博客主页:江池俊的博客⏩ 收录专栏:数据结构探索👉专栏推荐:✅C语言初阶之路 ✅C语言进阶之路💻代码仓库:江池俊的代码仓库🔥编译环境:Visual Studio 2022&#x1f38…

包装类、多线程的基本使用

包装类 1.基本数据类型对应的引用数据类型(包装类) 1.概述:所谓的包装类就是基本类型对应的类(引用类型),我们需要将基本类型转成包装类,从而让基本类型具有类的特性(说白了,就是将基本类型的数据转成包装类,就可以使用包装类中的方法来操作此数据)2.为啥要学包装类:a.将来有…

springboot上传文件到后台指定文件夹

第一步,在application.yml做一下配置,预设下载目录 files:upload:path: D:/SpringBootItem/springboot/files/ 其中有用到hutool工具依赖,如下在pom.xml中添加依赖,也可以选择不添加,自己修改下Controller中的代码即可…

批量采集头条号文章的工具-让我们更好地辨别信息好坏

大家好,今天我想和大家聊一聊一个在互联网时代备受瞩目的话题,那就是批量采集头条号的文章。作为一个热衷于信息获取和分享的人,我深知这一领域的挑战和机遇。 让我们来谈谈批量采集头条号的文章所面临的挑战。随着互联网的迅猛发展&#xff…

亚马逊API接口解析,实现获得AMAZON商品详情

要解析亚马逊API接口并实现获取亚马逊商品详情,你需要按照以下步骤进行操作: 了解亚马逊开发者中心:访问亚马逊开发者中心,并了解相关的API文档、开发者指南和规定。注册开发者账号:在亚马逊开发者中心上注册一个开发…