2024 Java后端面试场景题 51 道及答案解析!

因本面试题内容较多,共1314页,篇幅有限无法全部展现,故现仅展示前2道(14页),后续题目答案会在后面一一展示,如有需要的也可以,查看下方名片直接获取~ 非常感谢!

目录

1. 知己知彼才能百战百胜,如何做好面试前的准备工作

2024 年的行情,和 3~4 年前不同,通过海量简历投递和海量面试找工作的时代已经过去了。

在如今面试机会较少,并且面试难度较大的情况下。

充分做好面试的准备才是快速通过面试最有效的方法!

切忌把真实面试当靶场,最后带来的代价是非常巨大的!

面试无非就两个部分,投简历、面试!

很多人把重心放在投简历上,忽略了准备面试的重要性,最后的结果是获得了面试机会

但是在面试过程中被刷下来了。

1.1 怎么写简历

着手准备的第一步聚焦于简历的打造。

简历是他人初步了解你的窗口,其重要性不言而喻,因此精心构思简历至关重要。理想的简历应当围绕你的亲身经历构建,正如某些杰出人士仅凭一句“Unix 的创造者”便足以令人印象深刻。

尽管并非所有人都拥有如此耀眼的成就,但这一例证强调了个人经历在简历中的核心地位。

因此,选择那些能丰富你简历含金量的职位,从事能让你简历熠熠生辉的项目,乃是简历撰写的黄金法则——让经历说话,而非仅仅堆砌文字。

然而,简历的文字表达同样不可小觑,尤其是当我们缺乏显赫背景时。简历应当精炼,避免冗余信息导致焦点模糊,着重突出你的优势与技能。一般而言,简历应涵盖以下核心部分:

个人简介:用不超过 200 字简明扼要地概括自己,例如:“拥有超十年软件开发经验,带领团队逾四年,专长于构建高可用性、高性能的分布式系统,背景横跨互联网与金融业,目前担任 XXX 公司 XX 职位,负责 XXX 平台。”

  • 联系信息:推荐使用专业的电子邮件地址(如 Gmail),避免使用过于休闲的邮箱服务。若拥有个人网站、博客、GitHub 或 Stack Overflow 账号,务必附上,尤其是个性化域名更能彰显主动性和审美品味,且确保页面内容组织得当,真诚无伪。
  • 技术作品与展示:展示你的成果,尤其是对于前端开发者更为直接。后端开发者则可通过 GitHub 展示项目。专业证书或奖项同样值得提及,如微软或 Oracle 认证。

技能概览:

  • 技术栈:明确列出掌握的编程语言、框架、技术工具及设计理念,如 Java、SpringBoot、Redis、分布式系统架构等。
  • 专业领域:涵盖前端、算法、机器学习、分布式系统、数据库管理等。
  • 行业经验:涉及的行业如金融、电子商务,及特定业务如客户关系管理、支付系统等。
  • 软实力与经验:团队管理规模、项目管理经验、个人特质等,简洁明了即可。

确保简历内容与目标职位的技能要求对齐,以便快速建立匹配印象。工作与教育背景需精挑细选,强调关键项目、挑战、责任及所获成就,同时,这些内容应紧密支撑你的技能陈述,避免离题。

简历长度以不超过两页 A4 纸为宜,采用 PDF 格式以保证格式一致性。可借鉴 LinkedIn 或 Microsoft Office 模板美化外观,力求内容精炼,重点突出。

记住,简历的目标是凸显你的独特之处,哪怕仅展示两三个亮点,也足以引起注意。

最后,简历是打开机遇之门的第一步,尤其在竞争激烈的就业市场中,除了实质性的技能和经验,别出心裁的简历设计与正面积极的自我评价亦能增加脱颖而出的机会。

即便初始条件有限,展现出积极的态度、持续的学习意愿和解决问题的能力,同样能传达出你是一个值得投资的潜力股。

1.2 技术知识储备

在准备简历时,切记实事求是,你所列出的每一项技能都可能成为面试对话的起点。"精通"、"熟悉"、"了解"需准确区分,以免自相矛盾。

对于提及的每项技术,务必把握其基础及核心概念,因为面试过程中,面试官往往会逐步深入探讨,以此评估你的实际水平。因此,系统性复习相关书籍和资料是不可或缺的步骤,以备不时之需。

例如:

  • 如你标明熟练掌握 Java,那么不仅限于基础语法,还应涵盖并发编程、NIO、JVM等进阶知识,同时对 Spring、Netty 等流行框架的基本原理有所认识。
  • 提及 Go 语言,意味着你应至少阅读过官方的《Effective Go》,理解其核心理念。
  • 当列举 Redis 时,对其数据结构、性能调优策略、高可用部署方式及分布式锁机制等,通过官方文档的研读应达到一定的理解深度。
  • 如声称掌握面向对象设计,熟悉《设计模式》中的经典 23 种模式将是基本要求。
  • 对于分布式架构的宣称,则需对 CAP 原则、微服务架构、弹性设计以及 SpringCloud、Cloud Native 等相关技术框架有深刻理解。
  • 关于网络编程的技能,理解 TCP/IP 协议的三次握手、四次挥手过程,Socket 编程基础,以及 select、poll、epoll 等 I/O 多路复用技术,都是必不可少的知识点。

综上所述,你简历上的每一项技术标注,都应当基于你对该技术核心知识点的掌握之上。

这好比备考期末考试,你需要全面回顾教材,确保掌握大多数关键知识点,即使不必面面俱到,但对于 80%以上的重点内容,你都应做到心中有数。这样的准备不仅是为了应对面试,更是对自己技术深度和广度的负责态度体现。

1.3 项目准备(非常重要)

在面试过程中,分享个人项目经历或解决过的挑战几乎是每个面试官必问的环节,但令人诧异的是,许多候选人并未对此做好充分准备。以下四个经典问题频繁出现于面试之中:

1. 分享一个你最为自豪或最近完成的项目。

2. 讲述一次你攻克的最复杂或技术含量最高的难题。

3. 描述一个你经历过的最具挑战性或最艰难的项目。

4. 谈谈你曾犯下的最大技术失误或引发的技术故障。

这些问题背后,面试官的意图各异:

  • 第一个问题旨在探查你的成就顶峰、兴趣所在;

第二、三题侧重于你的问题解决能力和面对逆境时的心态韧性;

  • 而第四题则关注你对待错误的态度,以及是否具备反思与成长的能力。

值得注意的是,面试官会通过连续追问细节来验证信息的真实性,因为虚构的情节难以在严密的追问下自圆其说。

为有效应对这类问题,以下建议或许能帮助你更好地准备:

  • 构建故事框架:运用 STAR 法则(情境 Situation、任务 Task、行动 Action、结果Result)来组织你的叙述,确保内容条理清晰,避免冗长繁杂。
  • 添加细节:丰富的技术细节是说服力的关键,它能让故事显得更加真实可信。
  • 注入情感:真挚的情感表达能传递你的热情、自豪与坚持,确保情感源自真实的体验。
  • 融入反思:在叙述中穿插你的思考、教训总结及后续的改进措施,展现你的成长和成熟。
  • 达到这样的叙述水平并非易事,需要持续的练习与积累。日常工作中,培养即时总结的习惯,对经历进行记录与反思,是避免临阵磨枪的有效方法。

此外,提升语言组织能力与逻辑思维同样重要。通过撰写工作文档和经营个人技术博客,不仅可以锻炼写作技巧,还能深化对技术的理解和反思。

实际上,这些平日里的功夫,正是在关键时刻展示你专业素养与个人魅力的基石。因此,成功的面试表现,源于平日里一点一滴的积累与修炼。

面试建议是,一定要自信,敢于表达,面试的时候我们对知识的掌握有时候很难面面俱到,把自己的思路说出来,而不是直接告诉面试官自己不懂,这也是可以加分的。

1.4 程序员职业规划的利器-终局思维

没有人知道未来是怎样的,但未来并非虚无飘渺,而是以不同的概率形式活在今天,“终局思维”就是以时间为矢,找到其中概率最大的可能。

在和朋友的饭后闲聊的时候,常常会因为没有限定的发散,引发一些争论或者进入僵局,一般这个时候,我经常会引入一个词语“终局思维”,基于未来的角度去回看事情的发展,往往会得到一些有趣的结论。

在做职业规划的过程中,面对职场迷茫的咨询者,我也常常会用到这种方式,基于理想职业,去规划 Ta 的职业发展路径,再从众多路径中选择中最舒服或者最适合的去执行。

那么什么是终局思维呢?这不是什么新的理论,在一本十多年前的畅销书《高效能人士的七个习惯》中,就提出了“以终为始”的观点,这其实就是我们现在说的“终局思维”

“从现在开始,以你的人生目标作为衡量一切的标准,你的一言一行,一举一动,无论发生在何时,都必须遵循这一原则,即由个人最重视的期许或价值观来决定一切。牢记自己的目标或者使命,就能确信日常的所作所为是否与之南辕北辙。”

而这个词条的最早提出者,大部分认为是湖畔大学的曾鸣教授,关于终局思维他是这样表述的:“在面对选择时,从终点出发考虑问题,来决定你当下的选择。”

人的一生中,总有一些比较复杂且时间跨度很长的事业,我们常常做着做着就忘了自己为什么要做这件事,而“终局思维”就是在做一件事的过程中,通过想象最终的结局,以愿景为导向来反推现在的每一个行为、每一项选择,矫正自己是否正沿着正确的路线奔向终点站而没有跑偏,清晰接下来的每一寸时光都要以什么方式度过,然后“以终为始”,站在未来看现在,修正自己当下正在做的事情。

似乎听起来很简单,但实际很少有人能做到,因为更多的时候只是把“终局思维”作为知识去理解,而不是一种的思维的工具去运用。

职场问题概述来说无非就是定位、适应、发展、转型这几大类,处在不同职业发展阶段的人,一般都会遇到不同的困境,而中年危机的由来,大部分都可以划分到转型问题,

对于这个阶段的人生来说,要放弃的就不仅仅是一个岗位而已,还有你在行业中已经获得的资历;在转型过程中,最大的障碍就是你的薪酬待遇上。但是,我们要知道的是,当一个环境缺乏更多的想象空间时,给多少薪酬已经不重要了。

而采用终极思维的思考方式,会让你重新审视现在的经历,跳出 “当下利益优先”的思维模式,用一个长期的眼光去重新判断,对个人而言,面临转型期,你需要思考的是:

1、现在做的哪些事情是对未来 5-10 年有帮助的?

2、现在做的哪些事情对未来没有帮助?

3、对未来是否有帮助,你的判断依据是什么?

4、你的个人商业模式是什么?

回归主题,人到中年,该怎样规划职业生涯?首先要做到的应该是不断审视自己,思考从职业危机中得到了什么,而非失去了什么。当你重新筛选出的自己的核心价值观时,再去着手规划自己的职业:

1.4.1 重新制定整体的职业生涯规划

把目光投向未来,制定 5-10 的长期规划,然后制定一个 3-5 年的可操作性强、详细完备、动态性的中期职业生涯规划。

如果你对现在工作意味着什么,未来的职业的真实性都不清楚时,那你对你来说最重要问题,不是转型,而是把当下的工作做好,在工作中不断地明确未来的人生目标。

在制定长期规划时,你需要时刻提醒自己:面对快速增长、激荡变化的未来,你今后想要哪种类型的工作生活?什么样的工作或活动会更让你觉得开心?面对不可预测的未来,你未雨绸缪了吗?你有什么样的远大抱负?个人或生活偏好需要再改变什么以更适将来?在职业满意度方面,什么对你来说最重要...

1.4.2 实现思维方式的转变

转型并不是要是全盘否定过去的职业经历,从 0 开始,而是基于新的规划,重新归纳整理过去的经历,梳理出可复用的职场技能、管理经验、人脉资源、思维逻辑等,要相信没有任何一段经历是无用的,多余的,不断的思考,提炼,用唯一的经历打造独有的优势,从技术思维向管理思维转变;

1.4.3 探索职业第二曲线

走出岗位、平台、行业的舒适区,不局限服务于某一企业、行业,打开思路,积极探索职业第二曲线,用最小的试错成本去尝试一些你认为有趣的事情,去找到真正决定 “未来”的小概率事件。

终局思维可以使你考虑问题更加长远和深入,有时会领先同龄人和竞争对手几个维度;终局思维可以很复杂,也可以很简单,只要换一个未来的视角,从最大的问题开始,用倒序思考,你将会发现更多的可能性。

2. 电商平台中订单未支付过期如何实现自动关单?

日常开发中,我们经常遇到这种业务场景,如:外卖订单超 30 分钟未支付,则自动取订单;用户注册成功 15 分钟后,发短信息通知用户等等。这就延时任务处理场景。

在电商,支付等系统中,一设都是先创建订单(支付单),再给用户一定的时间进行支付,如果没有按时支付的话,就需要把之前的订单(支付单)取消掉。这种类以的场景有很多,还有比如到期自动收货,超时自动退款,下单后自动发送短信等等都是类似的业务问题。

2.1 定时任务

通过定时任务关闭订单,是一种成本很低,实现也很容易的方案。通过简单的几行代码,写一个定时任务,定期扫描数据库中的订单,如果时间过期,就将其状态更新为关闭即可。

 

优点:实现容易,成本低,基本不依赖其他组件。

缺点:

时间可能不够精确。由于定时任务扫描的间隔是固定的,所以可能造成一些订单已经过期了一段时间才被扫描到,订单关闭的时间比正常时间晚一些。增加了数据库的压力。随着订单的数量越来越多,扫描的成本也会越来越大,执行时间也会被拉长,可能导致某些应该被关闭的订单迟迟没有被关闭。

总结采用定时任务的方案比较适合对时间要求不是很敏感,并且数据量不太多的业务场景。

2.2 JDK 延迟队列 DelayQueue

DelayQueue 是 JDK 提供的一个无界队列,我们可以看到,DelayQueue 队列中的元素需要实现 Delayed,它只提供了一个方法,就是获取过期时间。

用户的订单生成以后,设置过期时间比如 30 分钟,放入定义好的 DelayQueue,然后创建一个线程,在线程中通过 while(true)不断的从 DelayQueue 中获取过期的数据。

优点:不依赖任何第三方组件,连数据库也不需要了,实现起来也方便。

缺点:

因为 DelayQueue 是一个无界队列,如果放入的订单过多,会造成 JVM OOM。DelayQueue 基于 JVM 内存,如果 JVM 重启了,那所有数据就丢失了。

总结DelayQueue 适用于数据量较小,且丢失也不影响主业务的场景,比如内部系统的一些非重要通知,就算丢失,也不会有太大影响。

2.3 redis 过期监听

redis 是一个高性能的 KV 数据库,除了用作缓存以外,其实还提供了过期监听的功能。

在 redis.conf 中,配置 notify-keyspace-events Ex 即可开启此功能。

然后在代码中继承 KeyspaceEventMessageListener,实现 onMessage 就可以监听过期的数据量。

 通过以上源码,我们可以发现,其本质也是注册一个 listener,利用 redis 的发布订阅,当 key 过期时,发布过期消息(key)到 Channel :keyevent@*:expired 中。

在实际的业务中,我们可以将订单的过期时间设置比如 30 分钟,然后放入到 redis。

30 分钟之后,就可以消费这个 key,然后做一些业务上的后置动作,比如检查用户是否支付。

优点: 由于 redis 的高性能,所以我们在设置 key,或者消费 key 时,速度上是可以保证的。

缺点:由于 redis 的 key 过期策略原因,当一个 key 过期时,redis 无法保证立刻将其删除,自然我们的监听事件也无法第一时间消费到这个 key,所以会存在一定的

延迟。另外,在 redis5.0 之前,订阅发布中的消息并没有被持久化,自然也没有所谓的确认机制。所以一旦消费消息的过程中我们的客户端发生了宕机,这条消息就彻底丢失了。

总结:redis 的过期订阅相比于其他方案没有太大的优势,在实际生产环境中,用得相对较少。

2.4 Redisson 分布式延迟队列

Redisson 是一个基于 redis 实现的 Java 驻内存数据网格,它不仅提供了一系列的分布式的 Java 常用对象,还提供了许多分布式服务。

Redisson 除了提供我们常用的分布式锁外,还提供了一个分布式延迟队列RDelayedQueue,他是一种基于 zset 结构实现的延迟队列,其实现类是RedissonDelayedQueue。

 优点:使用简单,并且其实现类中大量使用 lua 脚本保证其原子性,不会有并发重复问题。

缺点:需要依赖 redis(如果这算一种缺点的话)。

总结:Redisson 是 redis 官方推荐的 JAVA 客户端,提供了很多常用的功能,使用简单、高效,推荐大家尝试使用。

2.5 RocketMQ 延迟消息

延迟消息,当消息写入到 Broker 后,不会立刻被消费者消费,需要等待指定的时长后才可被消费处理的消息,称为延时消息。

在订单创建之后,我们就可以把订单作为一条消息投递到 rocketmq,并将延迟时间设置为 30 分钟,这样,30 分钟后我们定义的 consumer 就可以消费到这条消息,然后检查用户是否支付了这个订单。

通过延迟消息,我们就可以将业务解耦,极大地简化我们的代码逻辑。

优点:可以使代码逻辑清晰,系统之间完全解耦,只需关注生产及消费消息即可。另外其吞吐量极高,最多可以支撑万亿级的数据量。

缺点:相对来说 mq 是重量级的组件,引入 mq 之后,随之而来的消息丢失、幂等性问题等都加深了系统的复杂度。

总结:通过 mq 进行系统业务解耦,以及对系统性能削峰填谷已经是当前高性能系统的标配。

2.6 RabbitMQ 死信队列

除了 RocketMQ 的延迟队列,RabbitMQ 的死信队列也可以实现消息延迟功能。

当 RabbitMQ 中的一条正常消息,因为过了存活时间(TTL 过期)、队列长度超限、被消费者拒绝等原因无法被消费时,就会被当成一条死信消息,投递到死信队列。

基于这样的机制,我们可以给消息设置一个 ttl,然后故意不消费消息,等消息过期就会进入死信队列,我们再消费死信队列即可。

通过这样的方式,就可以达到同 RocketMQ 延迟消息一样的效果。

优点:同 RocketMQ 一样,RabbitMQ 同样可以使业务解耦,基于其集群的扩展性,也可以实现高可用、高性能的目标

缺点:死信队列本质还是一个队列,队列都是先进先出,如果队头的消息过期时间比较长,就会导致后面过期的消息无法得到及时消费,造成消息阻塞。

总结:除了增加系统复杂度之外,死信队列的阻塞问题也是需要我们重点关注的。

另还有《原创2024年Java程序员最新面试"八股文"攻略》 、《[2024真题合集]Java程序员一线大厂面试真题》如有需要,查看下方名片获取~

有需要的,查看下方名片获取~ 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值