vlambda博客
学习文章列表

拆解面试-菜鸟Java实习

本文约 2300字,读完需要 8 分钟,速读仅需 5 分钟


1. 前言

    这是日更面试经验以来,跟大家拆解的第 23 篇面经,天分享一位广州大学大学23届本科同学的面试经验,同学于今年的3月中旬参加了阿里菜鸟的面试,面试的职位是JAVA暑期实习,做国际物流相关业务,经历了3轮技术面试。技术面试都通过了,但是因为定级和工作地点的问题,同学拒绝了后续的hr面试。本次面经分享包含大量后端知识,对大家入职后端开发岗位有比较大的帮助


2. 求职者的面经自述


    因为找到一份离家近的工作,所以拒了hr面,一面和三面都和我说转正只能给到p4了,所以可能面试就比较容易通过

2.1 一面

这个面试官是我面试以来体验感最强的面试官,学到很多,非常感谢他

简单介绍下团队情况,有多少人,然后你负责那一块?

acm比赛流程说一下?

个人参加奖项说一下

做题到底是做哪一类题目?

核心能力是什么,能胜任的工作?

讲一下你做的比较好一个项目吗?

如果用redis做分布式锁,他的好处是什么,有考虑到其他方案吗?

spring 和 springboot的区别?

除了spring你还接触过其他框架吗,java系列的?

java 面向对象特性

反射的运用场景

spring 哪里运用到了反射

jdk哪里东西用了反射

集合的序列化和反序列化里面内容是什么,原理是什么?

设计模式?项目里面是怎么用的?

项目用什么垃圾回收器

索引特性

做的最复杂的sql是什么?项目里面是什么怎么用的?

2.2 二面

估计是看我没什么经验,基本不会往下深问

二叉搜索树遍历思路?

数据库索引原理?

有什么类型索引?各有什么特点?

inner join,left join,right join区别

高并发的时候,请求量非常大,同时更新数据库的一条数据,这时候应该怎么处理?

用锁和不用锁,怎么设计?

用缓存怎么实现锁?

redis为什么能实现分布式锁?

除了redis能实现还有其他实现方式吗

redis怎么部署的?这里我答了springboot怎么引入redis,感觉应该答单机和多机部署的。

项目功能

限流是怎么实现的,对什么限流?

外界怎么访问接口?

BIO和NIO区别

线程池原理,有什么参数?

为什么要用线程池?

threadlocal是干嘛的?

jvm内存模型

什么会导致栈溢出、堆内存溢出?

怎么排查堆溢出

springboot理解,它主要特性是什么

开始闲聊

2.3 三面

算法部分答的不好,因为这部分我很多都忘了算法名叫什么,只会写,不会说

排序算法有什么?快排 归并 堆排序 桶排序 计数排序。区别?

字符串匹配算法有什么? 哈希 kmp 字典树。区别?

最短路算法有什么? 迪杰斯特拉 spfa 弗洛伊德。区别?

笔试为什么只做了1题?

为什么要做这个项目

项目难点

项目遇到什么困难

redis集群同步,redis集群是ap还是cp?

对公司有什么了解,为什么要来我们公司?

程序设计和项目开发的区别


3. 面经的复盘和建议



    这次面试相对于本科应届的同学来说难度中等,面试的同学自身实力还可以,觉得难度不大。但是一面和三面都说定级只能给到P4,也因此最后放弃了这次机会。通常定级是根据面试的情况来确定的,定级较低通常面试的时候没有达到面试官的预期但是相比其他的面试者也还不错属于矮子里拔将军

    这里建议同学们面试的时候可以录音,面试完可以听一下自己的录音,对面试情况进行复盘,做到查漏补缺。



4. 涉及的高频问题以及答案

部分面试题答案引用自网络

什么是分布式锁


分布式锁是控制分布式系统之间同步访问共享资源的一种方式。在分布式系统中,常常需要协调他们的动作。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要互斥来防止彼此干扰来保证一致性,在这种情况下,便需要使用到分布式锁。


为什么要使用分布式锁


为了保证一个方法或属性在高并发情况下的同一时间只能被同一个线程执行,在传统单体应用单机部署的情况下,可以使用Java并发处理相关的API(如ReentrantLock或Synchronized)进行互斥控制。在单机环境中,Java中提供了很多并发处理相关的API。但是,随着业务发展的需要,原单体单机部署的系统被演化成分布式集群系统后,由于分布式系统多线程、多进程并且分布在不同机器上,这将使原单机部署情况下的并发控制锁策略失效,单纯的Java API并不能提供分布式锁的能力。为了解决这个问题就需要一种跨JVM的互斥机制来控制共享资源的访问,这就是分布式锁要解决的问题!


举个例子:


机器A , 机器B是一个集群, A, B两台机器上的程序都是一样的, 具备高可用性能.


A, B机器都有一个定时任务, 每天晚上凌晨2点需要执行一个定时任务, 但是这个定时任务只能执行一遍, 否则的话就会报错, 那A,B两台机器在执行的时候, 就需要抢锁, 谁抢到锁, 谁执行, 谁抢不到, 就不用执行了!


除了redis能实现还有其他分布式锁实现方式吗


zookeeper

zookeeper实现分布式锁的原理就是多个节点同时在一个指定的节点下面创建临时会话顺序节点,谁创建的节点序号最小,谁就获得了锁,并且其他节点就会监听序号比自己小的节点,一旦序号比自己小的节点被删除了,其他节点就会得到相应的事件,然后查看自己是否为序号最小的节点,如果是,则获取锁。流程如下:


 


database

用数据库实现分布式锁的方式和redis分布式锁的实现方式类似,这里采用数据库表的唯一键的形式。如果同一个时刻,多个线程同时向一个表中插入同样的记录,由于唯一键的原因,只能有一个线程插入成功。流程图如下:

其他实现

基于etcd的实现

基于consul的实现

对比

zookeeper分布式锁实现简单,其次ZK是CP模型,集群自己来保证数据一致性,但是会存在建立无用节点且多节点之间需要同步数据的问题,因此一般适合于并发量小的场景使用,例如定时任务的运行等。

redis分布式锁(非redlock)由于redis自己的高性能原因,会有很好的性能,适用于高并发的场景。

database分布式锁由于数据库本身的限制:性能不高且不满足高可用(即是存在备份,也会导致数据不一致),因此,工作中很难见到真正使用数据库来作为分布式锁的解决方案,这里使用数据库实现主要是为了理解分布式锁的实现原理。


5. 总结

    各位未来的大佬,今天给各位汇报的面经拆解就到此结束了,还是那句话:点赞加分享是对笔者最大的认可,能给笔者带来不断更新的无穷动力。

    祝各位早进大厂,拿高薪,娶富美!