我有一个朋友,一直在传统行业呆着,今年一心想要转到互联网公司,然后努力学习,努力面试,叫我把经验分享给大家。
两周三面,斩获某互联网大厂offer!

面试需要准备什么

首先说一句,无论去哪儿面试,都需要好好准备一下,因为很多时候有准备没准备其实差距挺大的,互联网大厂竞争这么激烈,如果不用心准备凭什么脱颖而出让人家选你呢,最起码要给人家眼前一亮的感觉才行。必要的准备就是以下几点:

1、自我介绍(必须)

自我介绍是面试里面不可能缺少的环节了,你用心的准备面试官还是能看出来的,不要说面试官就想看你最真实的一面,你磕磕绊绊说个自我介绍,真的不如你用心准备的自我介绍来的让人心里舒服,最起码让面试官感觉到了你的尊重。自我介绍需要有几点:个人基本信息,个人就职信息(包括职级、工作内容),个人项目履历,个人经历亮点(必须!!!想要从众多候选者中脱颖而出就看这一下!)。

2、个人简历上的技能点

这就毋庸置疑吧,如果个人简历上的技能点你都不会,那真的要去好好准备准备了,你既然写到简历上,就要好好的吃透这些技能点,这些技能点的相关面试重点我会慢慢的在博客中发布,当然也欢迎大家监督。技能点最好是包括了互联网大众技能点。
其中,HashMap与ConCunrrentHashMap源码、锁机制、线程池的核心参数、JVM、Spring、MySQL、Redis是面试的重灾区。其中包括两个Map的源码分析,包括synchronize的锁升级、AQS、volitate、CAS等,包括Spring的循环依赖、事务的传播方式,Mysql的索引、间隙锁等,Redis的缓存雪崩、缓存击穿、缓存穿透的问题,Redis的淘汰策略、LRU的实现等考点。
另外,分布式和微服务中的Dubbo、Zookeeper、SpringCloud也是用到的公司必问的知识点,也需要大家去详细了解。

3、项目履历

大家在介绍自己项目的时候,往往忽略了自己在项目中做出的贡献,认为自己只CRUD,没啥好说的,其实,每个人在项目中都起着重要的作用。(当然如果你没有重要的作用,就应该反思一下了对吧。)比如项目中遇到的各种问题(包括但不限于生产排错,比如cpu300%的问题排查、OutOfMemory的问题排错,还有项目优化,通过设计模式优化已有代码,比如策略模式或者状态模式优化大量的ifelse,工厂+模板模式优化方法调用以及方法实现等),这些你的项目亮点都是要说出来的,你做了就要说,面试官只会看你表现出来的那些,不会去赌你的内在是一个很牛逼的技术大佬。

好了,废话不多说,咱看看面试中遇到了什么样的问题。

某团一面问题

1、自我介绍

2、数据库设计思想,三范式,反三范式
三范式答得并不是特别好,反三范式举了项目中冗余字段的例子

3、hashmap和hashtable的区别,和concurrentHashMap的区别
这个问题很简单

4、sql优化的情景介绍
索引优化的项目经验举例,说了优化方案以及用到explain

5、对微服务的理解
说了微服务的优点,是马丁福勒提出的微服务思想,和传统项目比较起来他的优点在哪里,比如服务之间的影响小,耦合度低,可维护性高等

6、慢查询的优化方案
说了sql的优化,服务拆分,上缓存,MQ异步处理

7、jvm的内存溢出问题排查思路
说了栈溢出大部分是递归,oom有内存溢出、元空间溢出、无效GC的三种异常,说大部分出现这种都挂了,看日志,如果复现过程中可以用top命令查看内存和cpu以及问题线程,然后通过jstack查看线程详细运行情况位置

8、两个字符串如何获取最大子集
说换成两个char数组进行双层for循环,没想到更好的

9、两个数字字符串相乘,极限情况是两个字符串都是int最大值-1
字符串通过个十百千万每一位进行相乘然后用字符串的方式进行求和

10、一个数组,如果一个数字出现五次就是重数,求这里面的重数有啥,(后续告诉我可以去看一下投票算法)
说了桶排序的思想,但是缺陷很明显,用hashmap说不能用,没想到更好的

然后不出意外的凉了。

某8一面:

1、自我介绍

2、说一下redis数据结构有什么
说了五大数据结构,但是面试官好像并不是很满意(现在知道,现在都考的是除了5大数据结构外的数据结构,比如bitmap、hyperloglog,如果有需要以后也可以整理发出来)

3、说一下redis和数据库的数据一致性问题(先更新数据库还是先更新缓存)。
这里我答的不好,我说我们先更新数据库再刷新缓存,他也没继续问,估计没回答到点子上

4、说一下redis缓存雪崩、缓存穿透、缓存击穿的原因以及解决方法。
这里答得还可以,如果大家想知道答案就在评论区留言吧,如果需要我以后会发出来的

5、说一下ReentrantLock是不是可重入的,为什么要可重入。
我说了递归如果不可重入就死锁了

6、说一下ReadWriteLock和ReentrantLock的区别。
说了读写锁的读写分离在读多写少的时候性能会高

7、说一下juc中有什么锁可以读写不互斥。
这个没答上来

8、说一下线程池的几个参数。
我说了线程池参数+工作流程

9、说一下线程池里面的类都有什么?
就说了work和queen,答得不好

10、平时都看什么源码?
HashMap、ConcurrentHashMap、AtomicInteger、LongAdder、Spring等(这里忘了说AQS和sync)

11、如果让你实现mybatis你怎么做?
说了先定义prop和xml配置文件,读取其中内容,prop中存放数据库信息,xml存放sql信息,xml中通过namespace.id获取sql,
通过requestType的类型替换sql中的占位符,通过c3p0连接池连接数据库进行sql执行,通过resultType进行反射的数据封装返回结果。

总结:总体回答的很多可能没回答到点子上,所以这次面试效果不太好,就算过应该也是勉强过。

某8二面:

二面来电话,一面过了很开心,然后二面内容如下:

1、自我介绍

2、项目中数据被修改之后,redis数据时效性怎样保证。
我们时效性要求不高,一天只更新两次这样。

3、redis的淘汰策略说一下。
说了惰性删除,忘了说定期删除,然后说了内存淘汰机制LRU,包括返回错误、回收最少使用的键,忘了说回收随机键、回收存活时间较短的键

4、一个热点数据,redis失效,大量请求可能会打到数据库中,你怎么处理。(不能用限流降级熔断,不能用MQ)
没明白题意是redis挂了还是只是缓存未能预热,我按照redis挂了说的,判断请求过多达到限制之后的请求进行自旋从本地缓存中获取数据、其他线程请求并且设置缓存。

百度答案:缓存击穿的问题对应的热点数据,可以用数据预热、定时刷新、二级缓存、锁机制(放过某个线程进行查询,其余线程自旋等待先从缓存获取再尝试获取锁)

5、JVM调优,出现GCoverhead limit exceeded,我想动态的去查看GC日志怎么看,dump分析工具用过什么,怎么通过分析工具定位代码。
获取GC的输出日志通过分析工具分析,然后去项目中看对象的使用地方,进行判断以及处理。别的没说出来

6、怎么让永久代溢出?
建一个大的常量

答案:永久代是方法区概念的一个实现,存放类的定义、结构、字段、方法以及常量在内的类相关数据。

7、线程池运行中,查询一千万条数据需要一分钟,但是处理需要十分钟,你怎么做?
通过队列实现,具体没说出来

8、拒绝策略应该可以实现,但如果要分两步,先查询出来,再去处理,处理完成后然后再去查询如此反复,这样怎么实现。
countdownlanch

9、我要实现十个线程处理数据,处理完成后将处理异常的数据进行汇总统计怎么实现。
以前用futuretask现在可以用CompletableFuture(英语不好,这个词没说出来,说了一下功能)

10、线程数目的确定公式怎么算。
我们公司是2x,但是遇到执行时间非常久的就要用X+1(这里貌似说错了,应该是大IO的)

答案:CPU密集型要N+1,IO密集型要2N或者N/(1-阻塞系数),阻塞系数在0.8~0.9之间。

11、线程数除了CPU内核数、线程执行时间(而且时间也不这么重要),还需要考虑什么。
不知道(应该是大IO才对吧)

12、MySQL中分库分表,分表怎么处理,考虑因素有什么。(水平分表)
考虑是不是查询经常一起出现,比如时间范围查询或者类别查询。他问还有什么考虑的,我说分布的均匀程度。

13、注册中心eurkea和zookeeper的区别是什么,分别是CAP中的什么。
说了eurkea的保护机制,他问还有什么区别,我说实现方式不同吧,他打断了我没继续问,cap没说出来

14、熔断策略有什么。
最常用的有QPS和服务内部请求数

15、分布式事务用的多不多,不多就不问了。
(用的不多但是我有所了解,也没让回答)

16、NIO设计模式是什么,不属于23种设计模式。
说了一下通道中有个容器传递数据,但是貌似不对。

17、IO设计模式是什么
装饰者模式

18、NIO异步的还是同步的,什么时候用IO什么时候用NIO。
小文件用IO,大文件用NIO

总结:
问了好多这种场景问题,答得感觉不是很理想,最后问他问题的时候我请他点评一下我的表现,他说给我的是通过,但是概括能力需要提升,回答十分钟只有三分钟是他想要的答案。

个人感觉其实是能力还是不到位,因为很多技术确实没用过,对于这种场景类题目就有一些捉襟见肘。

但又不想说不知道,就想着多少说点思路,所以显得不是很概括,根本原因应该还是在熟练度和技术广度上。

某8三面(回答方式懒得说了,大家就看问题吧)

1、简单自我介绍
2、redis中先更新缓存再更新数据库还是先更新数据库再更新缓存?
3、缓存雪崩穿透击穿处理方式。
4、mysql分库分表怎么考虑。
5、有个订单表,你怎么拆分。
6、A服务中没有年龄,但我要用年龄进行筛选,B服务中有年龄,应该怎么做。
7、如果需要分页我们应该怎么做。
8、mysql中有七千万数据,要查询某用户近一千条订单,你怎么处理。
9、线上出问题了,开发测试谁的责任。
10、团队开发中有人有急事离开了,任务应该怎么办。

你有什么问我的?
我: 那个七千万怎么考虑呢?
回答:可以维护一个redis中一千条的数据,队列形式,只存key,然后通过key去数据库进行查询。

写在最后

经过两周三次精挑细选的面试,最终斩获了某8的offer,在这个it行业红利期已经消退的环境下,不断充实自己才能躲得过互联网寒冬以及越来越近的中年危机,从现在开始努力,最坏的结果不过也是大器晚成,但是如果真的不努力,被淘汰也真的没有那么远了。
顺便提一句,我的这个朋友,最后去了某东。
两周三面,斩获某互联网大厂offer!

相关文章:

  • 2021-12-02
  • 2021-05-20
  • 2021-11-05
  • 2021-04-14
  • 2021-10-09
  • 2021-08-14
  • 2021-04-24
猜你喜欢
  • 2021-11-19
  • 2021-06-16
  • 2021-12-16
  • 2021-09-12
  • 2021-07-27
  • 2021-05-16
  • 2021-08-27
相关资源
相似解决方案