8.7面经

news2024/11/28 19:04:55

1.字符串是怎么实现不可变的,不可变类,字符串不可变的好处

(1)保存字符串的数组被 final 修饰且为私有的,并且String 类没有提供/暴露修改这个字符串的方法。

(2)String 类被 final 修饰导致其不能被继承,进而避免了子类破坏 String 不可变。

(3)不可变类是指这个类的实例一旦创建完成后,就不能改变其成员变量值

String类的设计符合上面总结的不变类型的设计原则。虽然String对象将value设置为final,并且还通过各种机制保证其成员变量不可改变。但是还是可以通过反射机制改变其值

不可变类提供了线程安全的特性,但同时也带来了对象创建的开销,每更改一个属性都是重新创建一个新的对象。JDK内部也提供了很多不可变类如Integer、Double、String等。String的不可变特性主要为了满足常量池、线程安全、类加载的需求。合理使用不可变类可以带来极大的好处

(4)字符串不可变的好处

1.多线程安全修改安全

2.便于实现字符串常量池

2.如何实现String的equal方法:

1、首先是和自己比;
2、被比较的对象是否是String类型的;
3、再看它的长度是否相等;
4、比较它里面的每一个字符串;

扩展:

String里边的equals方法是比较两个字符串对象的内容是否是相等的;

 Object里边的equals方法是比较两个对象的内存地址是否是一致的,如果一致,即意味着这两个对象在内存中其实是一个对象,则返回true,否则返回false;

  注意,当我们写代码的时候,每当要重写Object的该equals方法时,通常都需要重写hashCode方法(也是Object类中的),以保证相等的对象必须具有相等的哈希码

3.hash冲突的解决方法:

1.拉链法(hashMap)

2.线性探测

4.向线程池提交任务的过程,核心线程与非核心线程的区别,为什么不建议Exectors创建线程池

创建线程池的方法常用的有两中,一种是new ThreadPoolExecutor配置7种参数,一种是Executors类,四种封装好的线程池类型(定长,单线程,可缓存支持灵活回收的线程池,支持周期执行任务的线程池)

Exector弊端

1.定长,单线程的允许的请求队列Integer.MAX_VALUE,可以堆积大量请求,从而导致OOM

2.可缓存,支持周期的允许的创建的线程Integer.MAX_VALUE.,会堆积大量线程,从而导致OOM

如果当前运行的线程数小于核心线程数,那么就会新建一个线程来执行任务。如果当前运行的线程数等于或大于核心线程数,但是小于最大线程数,那么就把该任务放入到任务队列里等待执行。如果向任务队列投放任务失败(任务队列已经满了),但是当前运行的线程数是小于最大线程数的,就新建一个线程来执行任务。如果当前运行的线程数已经等同于最大线程数了,新建线程将会使当前运行的线程超出最大线程数,那么当前任务会被拒绝,饱和策略会调用RejectedExecutionHandler.rejectedExecution()方法。

非核心线程与核心线程:

核心线程只是一个叫法, 核心线程与非核心线程的区别是:

创建核心线程时会携带一个任务, 而非核心线程没有

如果核心线程执行完第一个任务, 线程池内线程无区别

线程池是期望达到 corePoolSize 的并发状态, 不关心最先添加到线程池的核心线程是否会被销毁

5.在线程池添加任务,如何避免被多个线程调用

6.线程数如何设值,超线程,虚拟线程,虚拟线程如何保证不进行上下文切换

7.fokjoinpool

8.线程上下文切换,用户态与核心态

用户态,在应用程序中运行,代码没有对硬件的直接控制权限,不能使用硬件资源,

内存态,可以直接操作硬件资源,例如代码没有对硬件的直接控制权限

9.分布式锁解决什么问题,几种实现方式,mysql如何实现分布式锁

多进程并发问题解决:多个进程之间所有线程可见的区域实现这个互斥量

  • ①基于DB实现
  • ②基于Redis实现(连锁,redission(可重入,重试,超时释放))
  • ③基于Zookeeper实现

基于数据库:

在数据库中创建一张lock表,表中设置方法名线程ID等字段。并为方法名字段建立唯一索引,当线程执行某个方法需要获取锁时,就以这个方法名作为数据向表中插入,如果插入成功代表获取锁成功,如果插入失败,代表有其他线程已经在此之前持有锁了,当前线程可以阻塞等待或直接返回。同时,也可以基于表中的线程ID字段为锁重入提供支持。当然,当持有锁的线程业务逻辑执行完成后,应当删除对应的数据行,以此达到释放锁的目的。(删 失败问题:加过期时间+守护线程续命

因为是基于数据库实现的,所以获取锁、释放锁等操作都要涉及到数据落盘、删盘等磁盘IO操作,性能方面值得考虑。同时也对于超时失效机制很难提供支持,在实现过程中也会出现很多其他问题,为了确保解决各类问题,实现的方式也会越发复杂。

Redission:

可重入:利用hash结构记录线程id和可重入次数

可重试:利用信号量,发布订阅

超时续约:利用watchdog,每隔一段时间,重制超时时间(释放锁的过程,同时关闭watchdog)

 

Redis数据不是实时同步的,主机写入成功后会立即返回,存在主从架构锁失效问题。
Zookeeper数据是实时同步的,主机写入后需一半节点以上写入成功才会返回。
所以如果你的项目追求高性能,可以放弃一定的稳定性,那么推荐使用Redis实现。比如电商、线上教育等类型的项目。
但如果你的项目追求高稳定,愿意牺牲一部分性能换取稳定性,那么推荐使用Zookeeper实现。比如金融、银行、政府等类型的项目。

10.行锁锁的是什么

11.回表,减少回表的优化

索引下推:

没有:索引的过滤条件在mysql serve层执行。

有之后:下推到存储引擎,基于索引进行过滤筛选 减少回表策略

12.一个sql语句如何判断走没走覆盖索引

13.Ping的原理

14.40亿qq号10位只有1G内存(bitmap)

15springboot自动装配

16.spring事务失效

17.CAS的底层怎么实现

为什么在硬件上原子性

CAS缺陷

cas如何对多个对象使用

cas是在硬件层面实现的一个比较并交换的动作,在Java中是通过umsafe类对象实现的,提供了几个cas操作的api。cas本质上就是cpu的一个原子指令,在inter x86中的指令为compxchg,在执行该指令时,会对cpu总线加锁,保证在访问该共享资源时 得排队等待。所以实现了原子性也就是不可分割的特性,底层也是加锁的形式,不过是从操作系统的层面说的。

18.1.7与1.8hashmap区别

19.死链底层

20.父类加载器和子类加载器在代码上是什么关系

组合关系来复用父加载器的代码

21.如何破坏双亲

自定义加载器的话,需要继承 ClassLoader 。如果我们不想打破双亲委派模型,就重写 ClassLoader 类中findClass() 方法即可,无法被父类加载器加载的类最终会通过这个方法被加载。但是,如果想打破双亲委派模型则需要重写 loadClass() 方法。

Java提供了很多核心接口的定义,这些接口被称为SPI接口,同时为了方便加载第三方的实现类,SPI提供了一种动态的服务发现机制(约定),只要第三方在编写实现类时,在工程内新建一个META-INF/services/目录并在该目录下创建一个与服务接口名称同名的文件,那么在程序启动的时候,就会根据约定去找到所有符合规范的实现类,然后交给线程上下文类加载器进行加载处理。

22.B树和B+树区别

从MYSQL:

1.单点查询:

B+ 树的非叶子节点不存放实际的记录数据,仅存放索引,因此数据量相同的情况下,相比存储即存索引又存记录的 B 树,B+树的非叶子节点可以存放更多的索引,因此 B+ 树可以比 B 树更「矮胖」,查询底层节点的磁盘 I/O次数会更少

2.插入与删除效率

B+ 树的插入和删除效率更高。

3.范围查询

B+ 树所有叶子节点间还有一个链表进行连接,这种设计对范围查找非常有帮助

23如何优化页分裂算法

24. mysql 5.6.17后加索引时会锁表吗

25.进程间的通信方式。

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

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

相关文章

2023上半年京东烘干机行业品牌销售排行榜(京东商品数据)

随着人们消费水平的提高,追求健康品质消费的用户越来越多,这样的消费升级为市场的发展带来很大的动力。同时,随着洗衣机市场趋向饱和,增长趋于平缓,更新换代和结构升级成为行业的主旋律。 在这一市场背景下&#xff0…

【VUE】项目本地开启https访问模式(vite4)

在实际开发中,有时候需要项目以https形式进行页面访问/调试,下面介绍下非vue-cli创建的vue项目如何开启https 环境 vue: ^3.2.47vite: ^4.1.4 根据官方文档:开发服务器选项 | Vite 官方中文文档 ps:首次操作,不要被类…

Crond计划任务和用户权限提升(三十七)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、一次性任务 二、周期性任务 ​编辑 三、用户权限提升 3.1 su 3.2 sudo提权 总结 前言 计划任务是在指定的时间间隔内自动执行的任务。在Linux系统中&#xff…

开源项目如何贡献代码

以腾讯犀牛鸟开源项目ncnn为例 目录 fork项目仓库 添加远程仓库 同步更新仓库 贡献代码提交新PR PR未merge更新PR fork项目仓库 只需要做一次 到仓库页面点击fork,然后create forkTencent/ncnn: ncnn is a high-performance neural network inference frame…

Grafana 曲线图报错“parse_exception: Encountered...”

问题现象 配置的Grafana图报错如下: 原因分析 点开报错,可以看到报错详细信息,是查询语句的语法出现了异常。 变量pool的取值为None 解决方案 需要修改变量pool的查询SQL,修改效果如下: 修改后&#x…

Gym 0.26.2版本简明教程【1】

Gym 0.26.2版本简明教程【1】 文章目录 Gym 0.26.2版本简明教程【1】1. 构建gym环境2. gym.Env常用method3. 关于 gym 0.26.2新版本的更改4. Reference 1. 构建gym环境 使用gym.make(id,render_mode)我们可以注册一个环境,然后我们可以查看一下这个环境的一些信息&…

自动化处理,web自动化测试处理多窗口+切换iframe框架页总结(超细整理)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 web 自动化之处理…

TVS二极管能替代稳压二极管吗?有什么区别?

经常有应用工程师询问:TVS二极管能否替代替换稳压二极管?接下来,TVS厂家东我电子针对TVS二极管和稳压二极管这个话题,详细讲解下这两者的相同点和不同点。 TVS二极管英文名是:Transient voltage suppression diode&am…

3.01 用户在确认订单页收货地址操作

用户在确认订单页面,可以针对收货地址做如下操作: 1. 查询用户的所有收货地址列表 2. 新增收货地址 3. 删除收货地址 4. 修改收货地址 5. 设置默认地址步骤1:创建对应用户地址BO public class AddressBO {private String addressId;private…

.NET SqlSuger 简单介绍,超快开发数据库

文章目录 前言SqlSugar使用我的环境Nuget 安装新建连接串DB First 和 Code First使用增删改查 总结 前言 我之前介绍过EFCore 怎么使用Nuget快速创建数据库,我之后发现SqlSugar更快。这里简单再说一下SqlSugar如何使用 .NET Core 数据库DB First自动生成&#xff0…

3.核心抽象

3.1 环境对象 StreamExecutionEnvironment是Flink应用开发时的概念,表示流计算作业的执行环境,是作业开发的入口、数据源接口、生成和转换DataStream的接口、数据Sink的接口、作业配置接口、作业启动执行的入口。Environment 是 运 行 时 作 业 级 别 的…

如何使用自己域名进行远程访问内网群晖NAS 6.X

使用自己的域名远程访问内网群晖NAS 6.X【内网穿透】 文章目录 使用自己的域名远程访问内网群晖NAS 6.X【内网穿透】 在之前的文章中,我们向大家演示了如何使用cpolar,创建一条固定的、能够在公共互联网登录内网群晖NAS的数据隧道。这条隧道已经能够应对…

TextBrewer:融合并改进了NLP和CV中的多种知识蒸馏技术、提供便捷快速的知识蒸馏框架、提升模型的推理速度,减少内存占用

TextBrewer:融合并改进了NLP和CV中的多种知识蒸馏技术、提供便捷快速的知识蒸馏框架、提升模型的推理速度,减少内存占用 TextBrewer是一个基于PyTorch的、为实现NLP中的知识蒸馏任务而设计的工具包, 融合并改进了NLP和CV中的多种知识蒸馏技术&#xff0…

Bean基本注解开发和Bean依赖注入注解开发

目录 1.Bean基本注解开发 Component Scorelazy PostConstruct和PreDestroy RepositoryServiceController 2.Bean依赖注入注解开发 Value Autowired Qualifier Resource 扩展AutoWired 1.Bean基本注解开发 基本Bean注解,主要是使用注释的方式替代原有xml的…

记录--说一说css的font-size: 0

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 平常我们说的font-size:0;就是设置字体大小为0对吧,但是它的用处不仅仅如此哦,它还可以消除子行内元素间额外多余的空白! 问题描述&#xff…

Android前沿技术?Jetpack如何?

Jetpack Compose是Android开发领域的一项前沿技术,它提供了一种全新的方式来构建用户界面。近年来,Jetpack Compose在各大招聘等网站上的招聘岗位逐渐增多,薪资待遇也相应提高。本文将从招聘岗位的薪资与技术要求入手,分析Jetpack…

《Java-SE-第三十章》之哲学家就餐问题

前言 在你立足处深挖下去,就会有泉水涌出!别管蒙昧者们叫嚷:“下边永远是地狱!” 博客主页:KC老衲爱尼姑的博客主页 博主的github,平常所写代码皆在于此 共勉:talk is cheap, show me the code 作者是爪哇岛的新手,水平很有限&…

mongodb-win32-x86_64-2008plus-3.4.24-signed.msi

Microsoft Windows [版本 6.1.7601] 版权所有 (c) 2009 Microsoft Corporation。保留所有权利。C:\Users\Administrator>cd C:\MongoDB\Server\3.4\binC:\MongoDB\Server\3.4\bin>C:\MongoDB\Server\3.4\bin>mongod --help Options:General options:-h [ --help ] …

窥探系列之Mybatis-plus XML分页查询

mybatisPlus分页查询原理 searchCount字段控制是否查询总记录数 com.baomidou.mybatisplus.plugins.PaginationInterceptor 该插件拦截sql,如果searchCounttrue,则使用sql解析包jsqlparser根据原sql生成count语句,另外关键

面对裁员风险,我们该如何提升体能素质?——探讨年龄与体能的关系

文章目录 每日一句正能量前言你现在身体的体能状况如何?你有身体焦虑吗?如何保持规律性运动?你有哪些健康生活的好习惯?后记 每日一句正能量 当你看不到别人的缺点时,你就能从别人的行为、语言、思想中得到无限的智慧。…