java面试资料整理,2024年最新java面试题书籍推荐

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

  • 2020/07/06

MySQL篇

面试官:你平时开发用的什么数据库啊

小白:平常开发都用的mysql

面试官:那我们就来聊一聊mysql吧。你mysql一般用的什么存储引擎啊?

小白:因为业务需要我们试用的是支持事务的innodb的

面试官:那你知道innodb支持事务主要是怎么实现的么?

小白:是通过innodb特有的redolog,和采用两阶段提交来实现的。

面试官:那你可以说说redolog的理解,和两阶段提交是什么一个过程么?

小白:redolog就是为了防止每次对数据库的一个增删改的操作都去操作磁盘而设立的,也就是redolog节省了有关写的io消耗,而说到两阶段提交就要说说binlog了,binlog是server层的日志文件,记录了整个库的一个增删改的变化,redolog和binlog的区别主要有以下三点:

  • 1.redo log是InnoDB引擎特有的;binlog是MySQL的Server层实现的,所有引擎都可以使用。
  • 2.redo log是物理日志,记录的是“在某个数据页上做了什么修改”;binlog是逻辑日志,记录的是这个语句的原始逻辑
  • 3.redo log是循环写的,空间固定会用完;binlog是可以追加写入的。“追加写”是指binlog文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。

而所谓的两阶段提交就是将更新操作先记录到redo log里面,此时redo log处于prepare状态。然后告知执行器执行完成了,随时可以提交事务。然后执行器生成这个操作的binlog,并把binlog写入磁盘。在然后执行器调用引擎的提交事务接口,引擎把刚刚写入的redo log改成提交(commit)状态,更新完成

面试官:那你知道为什么要采用两阶段提交么

小白:因为如果不采用两阶段提交的话,无论是先写redolog还是先写binlog,如果在写完一个另一个还没有写完的时候服务crash(崩溃)了,后面根据binlog进行一个数据恢复就会产生数据不一致的问题。

面试官:索引你应该有所了解吧,你知道普通索引和唯一索引在使用的时候应该注意哪些么

小白:这里主要要考虑的是一个对change buffer的一个利用,因为change buffer是可以有效节约读磁盘的消耗的,而如果你一个在非必须的场景下,给一个字段建立了唯一索引,那么对那个字段的操作将不能使用到change buffer,从而浪费大量资源。备注(change buffer用来记录一些对数据库的更新操作,如果对数据库的一个更新操作,是肯定可以成功的,比如插入一条数据(不用去判断插入内容是否违法唯一约束啥的),那么就可以不用去把要操作的数据从磁盘读到内存中,等到下次要查询的时候在进行一个操作,从而达到一个节约读磁盘io操作,如果你那个字段加了唯一索引的话,就必须得读取到内存中进行一次判断,虽然判断消耗得cpu资源很少,但是那个读取得过程是很耗性能得)

面试官:那你在跟我讲讲你建索引要注意哪些事项啊

小白:首先因为innodb采用得聚簇索引,所以对主键得选取尽量采用占用内存小的,其次要利用好mysql建立索引得最左匹配原则来减少回表得一个操作,提升一个查询效率。

面试官:你提到了回表,你和我说说回表是什么意思啊

小白:因为innodb采用得是聚簇索引,只有主键索引(一级索引)才会记录整行得值,而二级索引(非主键索引)只会记录主键得值,也就是如果你查询条件用的是二级索引,而二级索引中保存得信息又不满足要查询得字段,那么就会在根据主键在取主键索引上进行一个查询,这个过程称为回表。通过索引覆盖就可以适当得减少回表得一个现象,从而提升查询效率,索引覆盖就是你建立得二级索引就已经满足你要查询得字段要求了,那样就不需要进行一个回表操作了

面试官:你对mysql得一个sql优化有没有过了解呢

小白: 对于mysql的一个优化,一般都会有一个监控平台对慢sql进行一个监控,也可以通过开启慢查询,设置一些参数来进行一个监控,当知道哪些sql语句是慢sql后,就可以通过explain命令对它的一个执行过程进行一个具体的解析,可以看到查询的一个类型,有没有用到索引,有哪些索引可以选择等等,然后如果是因为没有建索引,就可以创建,如果有索引没有采用的话,就分析一下原因进行一个修改。

Redis篇:

面试官:你日常开发中用到的非关系型数据库是用的哪个啊?

小白:平常开发中采用的是redis的。因为它有着丰富的数据结构,和十分给力的操作速度每秒读11万次,写8万次每秒。

面试官:那redis中常用的数据类型有哪些啊?

小白:常用的有五种:String,List,Set,ZSet,Hash,然后还有三种使用比较少的,GEO,hyperloglog,bitmap。

面试官:那你都知道他们的使用场景么,比如最常用的String?

小白:String类型常用做计数器,和分布式锁中

面试官:那你提到了分布式锁,那redis对分布式锁是怎么实现的呢?

小白:主要使用的是两个命令,一个setnx:如果key不存在在进行一个设置,还有一个expire:给一个key设置过期时间,用于如果一个线程跑的过程挂了,没有自己去释放锁,那么redis会进行一个自动释放。

面试官:如果你通过两条命令去进行一个锁的设置,是无法保证原子性的吧,这种情况你怎么处理?

小白:setnx和expire命令是可以当作set命令的参数进行整合的,那样整合成一条命令就能保证原子性了,格式如下:

set key value [ex seconds] [px milliseconds] [nx|xx]

ex seconds: 为键设置秒级过期时间。

px milliseconds: 为键设置毫秒级过期时间。

nx: 键必须不存在, 才可以设置成功, 用于添加。

xx: 与nx相反, 键必须存在, 才可以设置成功, 用于更新。

面试官:那这样还是会存在一个问题,假如你业务代码没有执行完,然后你的redis又把锁自动释放了,然后其他线程又可以获取到锁,那样不就还是又线程安全问题了?

小白:是的,但是针对这种问题redis官网也帮我们想了一种解决方案,也就是redis的红锁

面试官:那你可以和我说说redis的红锁是怎么回事么?

小白:sorry,i don’t no

面试官:你应该还记得怎么进来的把?我就不送了

小白:这个红锁有兴趣可以看看官网,给大家来一个传送门:redis红锁

面试官:那看你还知道在哪看api就再问一个问题好啦,redis的击穿,雪崩,穿透,都了解没,然后怎么解决呢

小白:先从雪崩开始说好啦,雪崩就是指再某一个时间点,很多热点key同一时间失效了,那样就会导致之前查redis的请求都去查mysql了,那样就会导致mysql扛不住,然后直接挂了,解决方法就是redis再给这些热点key设置过期时间的时候不要都设置一个时间点,可以加一个随机数。再说击穿好啦,击穿就是我很多请求,一直请求一个热点key,如果这个热点key设置了过期时间,那么它过期那一瞬间,所有请求就全都打到mysql上了,那样也可能导致数据库挂了,解决方案就是给这样的热点key设置永不过期。也就是不设置过期时间就好啦。然后还有穿透,穿透就是我发起的请求再redis中不存在,那样肯定会去请求mysql了的,但是实际上再mysql重也是没有的,比如我查id=-1这样类似的数据。这个解决方案的话就是增加一个布隆过滤器进行处理的。

面试官:那看你答得还行,说说redis得持久化机制把

小白:redis得持久化机制有两种,一种是RDB就是多长时间内多少key发生了变化,就使用一次快照得方式进行一次持久化,还有就是AOF持久化,有三个取值,一个是不开启,一个是每一次对key得修改都以记录日志得方式进行一个记录,还有就是一秒钟记录一次,一半采用最后最后一种。

面试官:那你再和我说说这两种得使用场景,和优劣

小白:直接看官网不会?

RDB的优点

  • RDB是一个非常紧凑的文件,它保存了某个时间点得数据集,非常适用于数据集的备份,比如你可以在每个小时报保存一下过去24小时内的数据,同时每天保存过去30天的数据,这样即使出了问题你也可以根据需求恢复到不同版本的数据集.

  • RDB是一个紧凑的单一文件,很方便传送到另一个远端数据中心或者亚马逊的S3(可能加密),非常适用于灾难恢复.

  • RDB在保存RDB文件时父进程唯一需要做的就是fork出一个子进程,接下来的工作全部由子进程来做,父进程不需要再做其他IO操作,所以RDB持久化方式可以最大化redis的性能.

  • 与AOF相比,在恢复大的数据集的时候,RDB方式会更快一些.

RDB的缺点

  • 如果你希望在redis意外停止工作(例如电源中断)的情况下丢失的数据最少的话,那么RDB不适合你.虽然你可以配置不同的save时间点(例如每隔5分钟并且对数据集有100个写的操作),是Redis要完整的保存整个数据集是一个比较繁重的工作,你通常会每隔5分钟或者更久做一次完整的保存,万一在Redis意外宕机,你可能会丢失几分钟的数据.

  • RDB 需要经常fork子进程来保存数据集到硬盘上,当数据集比较大的时候,fork的过程是非常耗时的,可能会导致Redis在一些毫秒级内不能响应客户端的请求.如果数据集巨大并且CPU性能不是很好的情况下,这种情况会持续1秒,AOF也需要fork,但是你-

  • 可以调节重写日志文件的频率来提高数据集的耐久度.

AOF 优点

  • 使用AOF 会让你的Redis更加耐久: 你可以使用不同的fsync策略:无fsync,每秒fsync,每次写的时候fsync.使用默认的每秒fsync策略,Redis的性能依然很好(fsync是由后台线程进行处理的,主线程会尽力处理客户端请求),一旦出现故障,你最多丢失1秒的数据.

  • AOF文件是一个只进行追加的日志文件,所以不需要写入seek,即使由于某些原因(磁盘空间已满,写的过程中宕机等等)未执行完整的写入命令,你也也可使用redis-check-aof工具修复这些问题.

  • Redis 可以在 AOF 文件体积变得过大时,自动地在后台对 AOF 进行重写: 重写后的新 AOF 文件包含了恢复当前数据集所需的最小命令集合。 整个重写操作是绝对安全的,因为 Redis 在创建新 AOF 文件的过程中,会继续将命令追加到现有的 AOF 文件里面,即使重写过程中发生停机,现有的 AOF 文件也不会丢失。 而一旦新 AOF 文件创建完毕,Redis 就会从旧 AOF 文件切换到新 AOF 文件,并开始对新 AOF 文件进行追加操作。

  • AOF 文件有序地保存了对数据库执行的所有写入操作, 这些写入操作以 Redis 协议的格式保存, 因此 AOF 文件的内容非常容易被人读懂, 对文件进行分析(parse)也很轻松。 导出(export) AOF 文件也非常简单: 举个例子, 如果你不小心执行了 FLUSHALL 命令, 但只要 AOF 文件未被重写, 那么只要停止服务器, 移除 AOF 文件末尾的 FLUSHALL 命令, 并重启 Redis , 就可以将数据集恢复到 FLUSHALL 执行之前的状态。

AOF 缺点

  • 对于相同的数据集来说,AOF 文件的体积通常要大于 RDB 文件的体积。

  • 根据所使用的 fsync 策略,AOF 的速度可能会慢于 RDB 。 在一般情况下, 每秒 fsync 的性能依然非常高, 而关闭 fsync 可以让 AOF 的速度和 RDB 一样快, 即使在高负荷之下也是如此。 不过在处理巨大的写入载入时,RDB 可以提供更有保证的最大延迟时间(latency)。

面试官:那你再跟我说说redis得哨兵模式好了

那么如何才能正确的掌握Redis呢?

为了让大家能够在Redis上能够加深,所以这次给大家准备了一些Redis的学习资料,还有一些大厂的面试题,包括以下这些面试题

  • 并发编程面试题汇总

  • JVM面试题汇总

  • Netty常被问到的那些面试题汇总

  • Tomcat面试题整理汇总

  • Mysql面试题汇总

  • Spring源码深度解析

  • Mybatis常见面试题汇总

  • Nginx那些面试题汇总

  • Zookeeper面试题汇总

  • RabbitMQ常见面试题汇总

JVM常频面试:

Redis高频面试笔记:基础+缓存雪崩+哨兵+集群+Reids场景设计

Mysql面试题汇总(一)

Redis高频面试笔记:基础+缓存雪崩+哨兵+集群+Reids场景设计

Mysql面试题汇总(二)

Redis高频面试笔记:基础+缓存雪崩+哨兵+集群+Reids场景设计

Redis常见面试题汇总(300+题)

Redis高频面试笔记:基础+缓存雪崩+哨兵+集群+Reids场景设计

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
300+题)

[外链图片转存中…(img-WVCjnRyc-1713419061442)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-5Oq4RObz-1713419061442)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值