
Java高频面试题
文章平均质量分 76
一灯架构
【一灯架构】。大厂高级开发工程师,只分享有趣的技术干货。
展开
-
学会使用MySQL的Explain执行计划,SQL性能调优从此不再困难
上篇文章讲了MySQL架构体系,了解到MySQL Server端的优化器可以生成Explain执行计划,而执行计划可以帮助我们分析SQL语句性能瓶颈,优化SQL查询逻辑,今天就一块学习Explain执行计划的具体用法。1. explain的使用使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈。在 select 语句之前增加 explain 关键字,MySQL 会在查询上设置一个标记,执行查询会返回执行计划的信息,并不会执行这条SQL。就比如下面这个:输出这原创 2022-08-15 21:36:09 · 383 阅读 · 1 评论 -
老程序员总结的四条工作经验教训,一部血泪史,推荐观看
想来从事互联网工作已经很多年了,已经从当初的懵懂少年逐渐退化成老油条。刚毕业的时候,真是个愣头青,什么都不懂,也什么都看不惯。整天加班忙得要死,还要忍受领导批评指责。期间踩过很多坑,今天特意总结四条经验教训,送给年轻的程序员们。程序员在工作中,接需求的时候,千万不要做小需求、小优化、小迭代。你以为是偷个懒,减轻自己的工作量,其实大大加重了自己的工作量。在你做了很多个小需求之后,你就会接触到很多业务模块的人,他们的业务、产品、运营、测试、开发、用户,有问题都会直接找你,每天都会看到钉钉未读消息99+,每个人回原创 2022-06-29 08:00:00 · 509 阅读 · 0 评论 -
高级程序员必知必会,一文详解MySQL主从同步原理,推荐收藏
MySQL主从同步是基于Bin Log实现的,而Bin Log记录的是原始SQL语句。Bin Log共有三种日志格式,可以binlog_format配置参数指定。常见的主从同步架构有一主多从、双主多从。一般是主库负责所有读写请求,而从库只负责容灾恢复和冗余备份。如果做了读写分离的话,主库负责写请求,从库负责读请求,可以提升数据库性能。一般是主库1负责所有读写请求,主库2不对外提供服务,只用来容灾恢复。相比一主多从架构,双主多从架构可以减少宕机时间,更快恢复数据库可用状态。当主库数据发生变更时,写入本地Bi原创 2022-06-26 16:42:43 · 5468 阅读 · 0 评论 -
彻底搞懂三大MySQL日志,Redo Log、Undo Log、Bin Log
MySQL实现事务、崩溃恢复、集群的主从复制,底层都离不开日志,所以日志是MySQL的精华所在。只有了解MySQL日志,才算是彻底搞懂MySQL。今天一灯就带你深入浅出的学习MySQL的三大日志系统,Redo Log(重做日志)、Undo Log(恢复日志)、Bin Log(备份日志)。Redo Log 记录的是物理日志,也就是磁盘数据页的修改。作用: 用来保证服务崩溃后,仍能把事务中变更的数据持久化到磁盘上。MySQL事务中持久性就是使用Redo Log实现的。你可能会问,为什么需要写Redo Log B原创 2022-06-25 11:08:59 · 332 阅读 · 0 评论 -
记一次排查线上MySQL死锁过程,不能只会curd,还要知道加锁原理
昨晚我正在床上睡得着着的,突然来了一条短信。啥,线上MySQL死锁了,我赶紧登录线上系统,查看业务日志。能清楚看到是这条insert语句发生了死锁。MySQL如果检测到两个事务发生了死锁,会回滚其中一个事务,让另一个事务执行成功。很明显,我们这条insert语句被回滚了。但是我们怎么排查这个问题呢?到底跟哪条SQL产生了死锁?好在MySQL记录了最近一次的死锁日志,可以用命令行工具查看:在死锁日志中,可以清楚地看到这两条insert语句产生了死锁,最终事务2被会回滚,事务1执行成功。这两条insert原创 2022-06-23 21:37:18 · 630 阅读 · 0 评论 -
面试官问我一条update语句加了多少锁?我总结了全套八股文
标题:面试官问我一条updat语句加了多少锁?我总结了全套八股文面试开始,直入正题。面试官: 看你简历上面写着精通MySQL,我问你一个MySQL锁相关的问题,你看一下这条SQL会对哪些数据加锁?表结构是这样的:我: age是非唯一性索引,MySQL的锁是加在索引上面的,应该只会对age=10的数据加锁。面试官: 确定吗?我: 嗯…,应该是的。面试官: 【嘲讽】,这就是你精通MySQL的水平吗?今天面试就先到这里吧,后面有消息会主动联系你。我: 这条SQL具体对哪些数据加锁,还需要看表中有哪些数据。My原创 2022-06-21 23:05:24 · 148 阅读 · 0 评论 -
MySQL的锁这么多,不知从何学起,看完这篇文章就够了
MySQL有两个核心的知识点,索引和锁。前几篇文章已经详细讲解了MySQL索引实现机制,今天再一起学习一下MySQL的锁。当多个事务并发操作同一批数据的时候,如果不加锁,就无法保证事务的隔离性,最后导致数据错乱。加锁是为了保证并发操作下数据的正确性。按锁的粒度可分为:表锁、页面锁、行锁、记录锁、间隙锁、临键锁按锁的属性可分为:共享锁、排它锁按加锁机制可分为:乐观锁、悲观锁下面依次介绍一下这几种锁:MyISAM和InnoDB引擎均支持表锁。优点:开销小,加锁快,不会出现死锁。缺点:锁定力度大,发生锁冲突概率高原创 2022-06-18 16:24:50 · 310 阅读 · 0 评论 -
面试官问我MySQL事务的底层原理?幸亏我总结了全套八股文
面试开始,直入正题。面试官: 看你简历上面写着精通MySQL,我先问你事务的特性是什么?我: 这个我知道,事务有四大特性,分别是原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability),简称ACID。原子性是指事务中所有操作要么全部成功,要么全部失败。一致性是指事务执行前后,数据始终处于一致性状态,不会出现数据丢失。隔离性是指事务提交前的中间状态对其他事务不可见,即相互隔离。持久性是指事务提交后,数据的修改永久保存在数据库中。面试官: 嗯,原创 2022-06-17 11:46:00 · 793 阅读 · 0 评论 -
记一次ThreadLocal引发的线上故障,年终奖没了,可能还面临辞退
记一次惨痛的线上ThreadLocal引发的故障,3个月的年终奖没了,可能还会面临辞退。耗子逗猫 —— 没事找事前几天,在工作不太忙的时候,为了展示我在工作中积极主动,技术能力较强,并给领导留个好印象,我就去翻翻项目代码有没有可优化的空间。没想到,我真让我找着啦。祸端就此埋下了!有用户反馈查询订单列表接口有点慢,我就去打印每一步的耗时信息。发现查询订单之前,需要先根据用户ID查询用户信息,而查询用户信息接口需要调用用户团队提供的服务,有时候网络较慢的时候,耗时达到200毫秒。而查询订单接口层层调用的时候,调原创 2022-06-16 15:19:42 · 142 阅读 · 0 评论 -
一篇文章讲清楚MySQL的聚簇/联合/覆盖索引、回表、索引下推
面试官: 看你简历上用过MySQL,问你几个简单的问题吧。什么是聚簇索引和非聚簇索引?我: 举个例子:有这么一张用户表用户表中存储了这些数据:那么在索引中,这些数据是怎么存储的呢?MySQL的InnoDB引擎中索引使用的B+树结构。别问为什么根节点存储了(1,4)两个元素,左子节点又存储了(1,2,3)三个元素,下面带有三个叶子节点,叶子节点之间又用有序链表相连?问就是B+树的特性,不了解的可以翻一下上期的文章。如上图所示,叶子节点中存储了全部元素的索引,就是聚簇索引。一般主键索引就是聚簇索引,如果表中原创 2022-06-15 19:10:34 · 640 阅读 · 0 评论 -
面试官问我消息队列为啥会丢失消息?幸亏我总结了全套八股文
面试官: 我看到你的简历上写着项目中用到了消息队列,还用的是kafka,你有遇到过消息队列丢失消息的情况吗?我: [疑问] 消息队列还能丢失消息?那谁还用消息队列!你是不是搞错了?我没遇到过丢失消息的情况,也没考虑过这个问题。面试官: 嗯…,小伙子,看来有些面试套路,你还是不太懂。今天面试就先到这里吧!给你的简历,我送你下楼。我: 消息队列发送消息和消费消息的过程,共分为三段,生产过程、服务端持久化过程、消费过程,如下图所示。这三个过程都有可能弄丢消息。面试官: 嗯,消息丢失的具体原因是...原创 2022-06-14 13:03:24 · 250 阅读 · 0 评论 -
面试官:高并发场景下,你们是怎么保证数据的一致性的?
面试的时候,总会遇到这么一个场景。面试官:你们的服务的QPS是多少?我:我们的服务高峰期访问量还挺大的,大约是3万吧。面试官:这么大的访问量,你们的服务器能撑住吗?有加缓存吗?我:有的,我们使用了Redis做缓存,接口优先查询缓存,缓存不存在,才访问数据库。这样可以减少数据库访问压力,加快查询效率。面试官:一份数据存储在两个地方,更新数据的时候,你们是怎么保证数据的一致性的?看到了吧,好的面试官一般不直接问你数据一致性的解决方案,而是循循善诱,结合具体的使用场景,再问你解决方法。如果你没做过这方面,没有线上原创 2022-06-13 19:33:06 · 237 阅读 · 0 评论 -
面试官问我消息队列为啥会丢失消息?幸亏我总结了全套八股文
面试开始,直入正题。面试官: 我看到你的简历上写着项目中用到了消息队列,还用的是kafka,你有遇到过消息队列丢失消息的情况吗?我: [疑问] 消息队列还能丢失消息?那谁还用消息队列!你是不是搞错了?我没遇到过丢失消息的情况,也没考虑过这个问题。面试官: 嗯…,小伙子,看来有些面试套路,你还是不太懂。今天面试就先到这里吧!给你的简历,我送你下楼。我: 消息队列发送消息和消费消息的过程,共分为三段,生产过程、服务端持久化过程、消费过程,如下图所示。这三个过程都有可能弄丢消息。面试官: 嗯,消息丢失的具体原因是原创 2022-06-12 11:13:12 · 237 阅读 · 0 评论 -
面试官问我MySQL索引为啥用B+树?我让他去问作者
面试开始,直入正题。面试官: 你知道MySQL索引底层数据结构为啥用B+树?而不用B树、红黑树或者普通二叉树?我: 这事谁知道作者咋想的?他可能是用B+树习惯了,个人爱好吧。面试官: 你倒是挺看得开。今天的面试就先到这吧,后面有消息会主动联系你。我: 要知道MySQL索引底层数据结构为啥用B+树,先要了解一下什么样的数据结构更适合建索引。为了保证数据安全性,一般都是把数据存储在磁盘里面。当我们需要查询数据的时候,需要读取磁盘,就产生了磁盘IO,相比较内存操作,磁盘IO读取速度是非常慢的。由于所需数据可能在磁原创 2022-06-11 15:15:45 · 262 阅读 · 0 评论 -
面试官问我订单ID是怎么生成的?难道不是MySQL自增主键?
程序媛本就稀有,美女面试官更是难寻。具体长什么样呢?就像下面这样:这么温柔可爱的面试官,应该不会为难我吧。嗯,应该是的,毕竟我这么帅气,面试可能就是走个过场。美女面试官是不是单身?毕竟程序员都不善交流,因为我也是单身,难道我的姻缘就在此注定。孩子的名字我都想好了。一冰!好名字。面试官: 小伙子,你低着头笑什么呐。开始面试了,你知道订单ID是怎么生成的吗?我: 还能咋生成?用数据库主键自增呗。面试官: 这样不行啊。数据库主键顺序自增,每天有多少订单量被竞争对手看的一清二楚,商业机密都暴露了。况且单机MySQ原创 2022-06-10 14:21:27 · 1594 阅读 · 0 评论 -
面试官问我怎么实现分布式锁?幸亏我总结了全套八股文
面试开始, 直入正题。面试官: 你有没有参与过秒杀系统的设计?我: 没有,我平时都是开发后台管理系统、OA办公系统、内部管理系统,从来没有开发过秒杀系统。面试官: 嗯…,小伙子很实诚。今天就先到这里吧,后面有消息会主动联系你。我: 参与过秒杀系统,并独立负责过秒杀系统的架构设计(【狗头】是的,都是我设计的)。面试官: 这样才对,这样我才能接着往下问。你在设计秒杀系统的时候,怎么防止商品超卖?比如活动中只有一台iPhone,最终卖出100台,肯定不行,平台要亏钱。我: 肯定要加锁,不过由于秒杀系统请求量较大,原创 2022-06-09 10:07:07 · 274 阅读 · 0 评论 -
面试官问我怎么分库分表?幸亏我总结了一套八股文
面试开始,直入正题。面试官:小伙子,看到你的简历上面写了项目中有对MySQL进行分库分表,为什么要进行分库分表?我:不知道啊!谁知道老大咋想的,反正我来的时候就已经分好了。面试官:嗯…,今天的面试就先到这吧,有后续面试会通知你,我送你下去。我:当MySQL单表数据量过大,比如超过5千万条的时候,读写性能变得很差。而且常规的优化手段已经不起作用了,比如:SQL调优、添加索引、主从复制、读写分离。这时候就需要用到MySQL终极优化方案 — 分库分表。面试官:不错,我该怎么判断项目是需要分库还是要分表?是先分库还原创 2022-06-08 22:19:02 · 616 阅读 · 0 评论 -
面试官问我为啥要用MQ,幸亏总结全套八股文
互联网公司的项目没有不用到MQ(消息队列)的,在简历中写上项目中用到MQ,也算是亮点之一。既然你写了,面试官就会问,你对MQ到底了解多少?面试官: 小伙子,我看你简历上写了,在项目中用到了MQ,你们项目为什么要引入MQ?其实这道题就是让你回答MQ的作用是什么?MQ的作用就三个:解耦、异步、削峰。 如果你直接回答这三个作用,会给面试官一种死记硬背的嫌疑,所以要结合实际项目具体分析。面试官你好,我们公司是做电商系统的。核心是交易服务,交易服务要调用另外三个服务,订单服务、库存服务、仓储服务。这三个服务如果有一原创 2022-06-08 22:09:17 · 242 阅读 · 0 评论 -
阿里面试官:如何实现三个线程交替循环打印?
问题:如何实现三个线程交替循环打印?示例:线程1打印A,线程2打印B,线程3打印C,要求交替打印,并且可以循环打印。输出结果类似:ABCABCABC这道题的难度是五颗星,在面试中也会经常遇到,如果是第一次见到这道题,很难在短时间内想出合理的解决方案。如果只要求交替打印一次的话,实现比较简单,可以用Thread.join()方法,一个线程等待另一个线程执行完成。现在要求循环打印,就涉及线程间通信,必须要用到锁,一把锁肯定不够。例如线程1释放锁之后,线程2和线程3都可能获取到锁,是随机的,现在要求必须是线原创 2022-06-08 21:56:22 · 943 阅读 · 0 评论 -
面试官:你能写个LRU缓存吗?
面试官: 你能手写个LRU缓存吗?你: LRU是什么东西?(一脸懵逼状)面试官: LRU全称Least Recently Used(最近最少使用),用来淘汰不常用数据,保留热点数据。面试官: 今天的面试先到这吧,有其他面试我们会再联系你。别担心,再有人问你LRU,就把这篇文章丢给他,保证当场发offer。目的是把最不常用的数据淘汰掉,所以需要记录一下每个元素的访问次数。最简单的方法就是把所有元素按使用情况排序,最近使用的,移到末尾。缓存满了,就从头部删除。常用的数据结构有数组、链表、栈、队列,考原创 2022-06-08 21:52:54 · 200 阅读 · 0 评论 -
Java程序员怎么避免空指针异常?看完这篇文章再也不用担心了
Java程序员工作中遇到最多的错误就是空指针异常,无论你多么细心,一不留神就从代码的某个地方冒出NullPointerException,真是令人头疼。到底怎么避免空指针异常?看完这篇文章,可以帮助你。2. 字符串比较,常量放前面3. 方法返回空集合4. 转String,用valueOf()方法代替toString()valueOf()方法源码是:5. 判空,用工具库apache commons是最强大的,也是使用最广泛的工具类库,用它就行了。6. 用注解帮你检查7. 避免不必要的拆原创 2022-06-08 21:37:40 · 3363 阅读 · 0 评论 -
一文详解LinkedList源码
上篇文章和一块学习了ArrayList源码,本文再和大家一块学习一下LinkedList源码。LinkedList底层是基于双链表,实现了List和Deque接口,所以既有List增删查改的功能,又有Deque的头尾操作的功能,在队列源码中杯经常使用。先看一下LinkedList的常用方法。...原创 2022-06-06 16:46:59 · 417 阅读 · 0 评论 -
一文详解ArrayList源码
ArrayList是我们开发中最常用到的集合,但是很多人对它的源码并不了解,导致面试时,面试官问的稍微深入的问题,就无法作答,今天我们一起来探究一下ArrayList源码。原创 2022-06-06 16:43:33 · 162 阅读 · 0 评论 -
HashMap的高阶用法,开发效率提升10倍
HashMap在工作中使用非常频繁,其实在JDK1.8的时候新增一些更高阶的用法,熟练使用这些方法可以大大提升开发效率,写出更简洁优美的代码。原创 2022-06-06 16:40:17 · 335 阅读 · 0 评论