应聘蘑菇街25k(Java岗),不曾想被问到怀疑人生!

前言

本文是一位粉丝朋友前段时间的真实面经经历,面的是蘑菇街

背景介绍:

工作经验:Java开发5年

学历背景:重庆邮电大学(信息安全专业)

工作经历:主要业务在柬埔寨做移动支付钱包(聚合支付的项目,让柬埔寨当地华人能使用微信、支付宝支付)

注意:以下内容均为真实面经分享,大家可以认真阅读完,看下这些面试题你是否能答的让面试官满意,同时我也会分享一些面试的小技巧给大家,主要告诉你如何准备简历,如何准备面试,2020大厂面试真题分享(含答案),哪些学习资料值得看。

话不多说,下面一起跟着这位粉丝朋友面试经历来看看他的面试之旅吧,另外,下文中涉及到的面试题答案、复习资料,均有完整PDF版分享,关注+转发后私信“666”即可免费获取

面试全过程

面试官:自我介绍一下吧

程序员:你好,我毕业于XXX,工作5年了,最近的工作主要是负责XXX(见以上背景介绍)

面试官:看到你写到熟练掌握Java语言的高级特性,简单介绍一下Bean SpringBean一个注入过程吧

程序员:Bean的注入过程......首先是从配置文件(注解)里面把它和对象.....额,我对这方面还是不太熟悉

面试官:没事没事....我们接着往下聊

程序员:尴尬一笑

面试官:我看大你写到你了解一些高级特性,你能给我简单的介绍一下Java8有哪些新特性吗,或者你比较擅长的新特性有哪些?

程序员:Java8主要就是在语法上就是lambda表达式,它可以用函数式进行那个函数式编程,函数式接口的意思就是它这个接口它只有一个方法.....

面试官:还有别的吗?

程序员:还有一些流的操作,比如:Stream API它可以简化编程语义,显得更清晰,比如在做一个filter功能,就可以绑定数据把不符合要求的数据过滤掉,就在以前的话写一个for循环,看起来就没那么好理解....然后对于数据结构进行了一些优化,像ConcurrentHashMap,它底层实现改成了红黑树.....

面试官:你刚刚说的都是一些优化,我问的是它新加的一些高级特性

程序员:再次尴尬一笑.....

面试官:你刚刚提到它的流式处理,那对比像foreach或者基本的for循环,它有没有在效率上进行优化,还是说它更慢了?你有去了解过吗?

程序员:额...没有

面试官:我看你说对并发编程有些了解,你能跟我讲一下Synchronized和Lock锁它的底层实现原理吗?

程序员:啊....Synchronized是一个语义级的支持,它在一个对象头里面,它有一个Mark Word的标记去记录它的锁,Lock显示锁是利用了它底层是一个AQS,它式一个双向链表的先进先出的一个队列,它只有当前持有锁的线程就是一个对头,然后它释放出来之后,就会利用一个自旋的操作,让下一个线程作为队头这样子

面试官:那它们两个分别是什么层面的呢,是jdk层面还是JVM层面,还是?

程序员:Synchronized是JVM层面的,Lock是jdk层面的

面试官:刚刚你说到了Synchronized,你有去了解过它锁方法、锁对象和锁代码块分别是怎么去实现的吗?

程序员:额.....这个没有

面试官:那你了解Synchronized锁升级过程吗?

程序员:没有....

面试官:那刚刚提到了Lock,CAS你能给我简单的介绍一下吗?

程序员:CAS就是比较并交换

面试官:恩恩,提到这点就可以了,那你有在实际开发过程中有实际的一些应用吗?应用到乐观锁的一个过程

程序员:有的,就譬如,我在更新数据库的时候,如果一个数据库用的是乐观锁的话,我也用一个自旋的操作,就把他更新到成功为止

面试官:自旋的效率会不会很低?如果一直取不到这个锁的话,那可能会造成一些线程堵塞,或者在高并发场景下其他的会影响到很多效率,有考虑到这个问题吗?

程序员:也考虑到了.....如果并发高的时候确实不太适用用自旋,这个时候更适合用悲观锁

面试官:那跟我聊一下线程池吧

程序员:线程池是.....我还是先说一下它的工作流程,再变成先提交进来,它先进入核心吃里面,如果线程书大于coreSize,就会进入一个阻塞队列,阻塞队列满了后就会新建一些线程,进入最大的池里面;当线程数,连maxSize的超出了之后,它就会执行一个拒绝策略,JDK自带的拒绝策略有四种:一种是直接丢弃;一种是抛异常;一种是由调用者的线程执行;一种是丢弃阻塞队列里面等待时间最长的一个线程

面试官:我看你简历上还提到了熟练掌握JVM调优的知识,我能问一下你了解它调优的一些基本步骤吗?

程序员:啊....一口老血,调优的基本步骤....就譬如,我从...恩..我从OOM说起吧....如果生产上发生一个OOM异常,首先是要判断它是在堆里面发生的还是元空间里面,还有......它还有一种类型就是GC效率过低.....吧啦吧啦

面试官:假设给你一一个场景,如果现在遇到了一一个线上CPU100%的一一个场景,你怎么去排查这个问题,说一下你的大概思路

程序员:首先用Top命令,如果那个机器上运行还有其他进程,就先查出是哪个进程调用的占用的CPU最高...

面试官:打断一下、打断一下, 一般我们在Linux上面去查进程的命令,你还记得吗?

程序员:就知道要用ps

面试官:那你继续吧

程序员:嗯嗯,然后查出占用CPU占用最高的进程,就找这个进程里面占用最高的一个线程,那个命令我忘了,反正拿出进程之后就转换为16进制的,然后再用jstack打出它具体的堆栈,定位到具体的哪一行代码

面试官:恩,可以的,我看下面你还提到了像MySQL也是比较熟悉的, 一般像MySQl怎么去优化它的查询呢?

程序员: emm, .一般就用explain执行计划,看看它执行的各方面的数据,如果索性没用到的话就建索引就是这样子...

面试官:那索引一般MySQL有几种类型?

程序员:一般就两种吧.. hash和B+树

面试官:那我们为什么要用B+树?不用别的数据结构,比如平衡二叉树、红黑树这些?

程序员:不用平衡二二叉树,是因为平衡二叉树树高太高了,如果你数据放在内存的话,用二叉树也是没有问题的,但如果树高很高的话它就会频繁访问硬盘, IO就会变强

面试官:那树高低也有B树,为什么它用B+树?

程序员:额...这里就不是很了解了

面试官:你能跟我说一下MyISAM和InnoDB的区别吗 ?

程序员:主要的区别是MyISAM使用的非聚集索引,所以它的索引直接指向的是数据项; InnoDB用的是追溯索引,它的索弓|是指向它的主键索引,它的主键索弓|采用相同的数据项。然后, InnoDB支持redo log日志,还有一个InnoDB支持事务和行锁 , MyISAM只支持表锁...

面试官:问一个扩展性的知识,你有去了解过一-张表, 最多可以建多少个索引吗?

程序员:尴尬...没有了解过

面试官: 16个,你可以回去看一看,扩展性的知识没关系

程序员:好的好的...

面试官:我看你也熟悉Redis啊,这么多缓存中间件,你是怎么想到去用Redis的呢?或者说你有没有想过在开发过程中技术选型的时候,为什么选择Redis ?

程序员:首先我说一下Redis和Memcache ,我理解就是Redis的数据类型比Memcache丰富很多,因为它有5种数据结构,而Memcache对应的只有Redis的string。Redis还有一 -个list它可以作为队列,还有set. zset、 hash, 数据类型丰富很多,能满足生产上的更多场景,MongoDB的话,我不是很了解...

面试官: Redis为什么这么快?

程序员:因为它的IO模型是异步非阻塞,还有它是单线程的

面试官:你确定它一定是单线程的吗?

程序员:尴尬一笑

面试官:那如果我断电了, 是不是数据就丢了? Redis官方是怎么保证数据的高可用呢?

程序员:它有一个持久化,就是把数据持久化到硬盘里面,持久化也有两种方式,一种是RDB ,每隔一段时间就会把内存快照存到硬盘里面, 一般不太用;还有一-种是AOF ,就是把命令写到文件里面,如果断电的话可以根据AOF写的文件来恢复读写的数据..

面试官:你刚刚提到RDB用的不多,其实用的还是挺多的,一般在生产 上都是两个同时开启的,两者有优点也有缺点, AOF数据会安全一点,但是恢复速度比较慢,RDB恰巧相反,-般应急情况下都会用RDB的,然后再用AOF去追加那些不全的数据

(又受教了..)

面试官:你了解过它的集群吗?

程序员:..没有了解过

面试官:那你跟我讲一下缓存击穿和缓存穿适这两者 你的理解吧

程序员:缓存穿透的意思就是说,它查询的时候缓存没有命中缓存层,就直接到达了存储层后端的传输....缓存击穿我不太了解,.尬笑

(面试官解释什么是缓存击穿. . .. )

面试官:我看你说熟悉一些主流框架,像spring和mybatis ,那我问-个spring很基础的点吧,你说一下Spring的优点吧

程序员: emmm.. Spring的优点:我觉得它没有侵入,它主要的一个功能就是替你把你的对象的依赖管理起来

面试官:那不就是AOP和IOC吗?可能毕业太久都忘了吧,我看你毕业5年了

程序员: AOP和IOC这两个优点我倒是没忘,你说它优点的时候,我可能瞬间往另-一个方向想了, 就想着觉得还有什么大的优点哈哈

面试官:我看你写了一一些分布式的框架,那你跟我说一下Dubbo的调用链路吧 ,从生产者到消费者整个链路

程序员:陷入沉思:生产者启动的时候,首先去ZK注册,消费者如果是第一次调用生产者的话,也是先去ZK那里拿到生产者的一个IP地址信息以及端口,再去访问生产者...

面试官:就完了? (面试官大笑)这中间像那种它服务暴露过程,然后它下面在调用过程中其实还有一个Monitor什么的,在启动的时候还有一-个Container的容器 , 不然你想它怎么跟Spring Bean融合是吧?

程序员:明白了明白了

面试官:我看你还熟悉常见的设计模式,那你了解哪些设计模式?除了单例和工厂

程序员:我说一下项目中比较常用的几个:策略模式,它的内结构有一-个Context,它是聚合的一一个抽象的策略接口,还有很多个具体的策略实现类来实现它。还有一一个状态模式,.. . 吧啦吧啦说了一下

面试官:我看一下你项目里面以金融场景居多,那么在金融支付场景中你是怎么保证幂等的?

程序员:首先在数据库层面是要做一个唯一索引的,如果在访量稍微大的情况下,可以考虑把一些需要做幂等的数据先存到缓存里面

面试官:那你存在缓存里面是怎么去做的呢

程序员:下一笔订单的时候,可以把订单号放到Redis里面,下一-笔订单来了之后先去Redis里面检查是否存在此订单,然后在那里过站)

面试官:那不对啊,你-一个订单号按道理来说会出现各种场景,像退款、下单、支付、发货等等都是一个订单号操作的,那你怎么保证是一一个场景还是多个场景在这里进行操作的?因为它完成可能是支付成功后,商家马上接到这笔订单然后发货,对吧?

程序员:对对对,我刚说的就是下单新建一个订单的场景

面试官:那怎么避免重复消费呢?或者说是怎么避免重复支付这种场景呢?

程序员:额..免重复支付我目前做法就是从数据库里面查一下订单的状态 ,然后用状态机的状态,就刚刚说的设计模式,如果已经完成了,就已经到了一个状态了,就不会对这笔订单做修改。如果它还是要处理的话,就证明它还可以留下失败和成功的方法)

面试官:聊一下分布式锁怎么实现?

程序员:分布式锁主要是控制我们平时所谓的一-个共享资源的修改,平时就用Redis setnx原子操作)

面试官:我看你基本上都是待了一年就离职了,你能说一下你离职的原因吗?

程序员:.........

面试官:你对自己职业规划大概是什么样的?

程序员:往互联网金融行业走

面试官:你有什么想问我的?

程序员:问了一些之前没太懂的

面试总结:从这场面试官中可以看出,面试官没有深问,不然估计80%的内容都答不上来,基本上都是偏基础的东西,底层的内容没有怎么问,写了个Dubbo在简历上,面试官都没有问他Spring Cloud,Hystrix容器这些,连bus都可以问出一堆东西,一旦问了真的就只有尴尬了,问到怀疑人生。

如何备战面试

首先,可以去投一些小公司的简历,去面试扫盲,看看哪些东西不会,欠缺哪些知识,然后回家做面试复盘。

针对自己简历做优化,不要搞得写了一个Dubbo,然后面试官稍微往深一点问你就答不出来了。简历上注意以下三点:

(1)注意区分:了解,熟悉,精通,不要乱写,面试官很多问题都是根据简历描述来进行的;

(2)专业知识和项目经验在精不在多,尤其是项目经验一定要写自己熟悉的且有内容可说的,不要认为写得越多越好;

(3)要熟悉自己的简历内容,准确掌握,最好是多阅读自己的简历。

其次,也可以在前期做好准备,多去刷一刷面试题,多看一些学习资料或者视频教程等等,这里我也分享一些我收集整理出来的学习资料以及面试真题分享给大家,【转发+关注】后私信“666”免费领取

Java核心内容整理

 

面试真题整理

建议

大家可以把Java基础,JVM,并发编程,MySQL,Redis,Spring,Spring cloud等等做一个知识总结以及延伸,再去进行操作,不然光记是学不会的,这里我也提供一些脑图分享给大家:

最后

无论是哪家公司,都很重视基础,大厂更加重视技术的深度和广度,面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。

针对以上面试技术点,我在这里也做一些资料分享,希望能更好的帮助到大家。【转发+关注】后私信“666”即可:

希望大家在金九银十都能拿满意的offer!


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值