一份来自一月寒冬互联网一线的面经(附面试题)
1.背景:
因为公司变动,lz不得不出来看看机会, 面试的岗位主要是后端,历经三周,面了北京大大小小的几家公司,最后收获了满意的offer。
自己也成长收获了不少, 谨以笔记,自己可以日后回忆,也希望能帮助到最近寒冬下需要找工作的同学,在文章的后面会附上一点小心得和建议。
2.level
我是16年本科毕业, 算上实习接近2年半-3年的工作经历吧,一直做java后端。 自己定位大概能到p6+的水平。有大厂经验,本科211, 所以面试机会总体来说还是挺多的。
3.过程
大概是从元旦过后开始写简历,投简历,从7号开始陆陆续续面了若干公司, 有好有坏,以表格形式记录如下,以我面试的时间排序。
声明:虽然博客没有什么人看,但是如果您认为记录有不实或者伤害到下述公司名誉啥的, 直接联系我删除即可。
有朋友建议我省掉公司名,我就用某代替吧。
公司 | 部门 | 渠道 | 结果 | 感受(办公环境,面试难度,感受) |
某信银行 |
DevOps |
Boss |
4+0,拿到offer. (4技术面 0hr面,下同) |
某信的位置和办公环境都很不错,位于安贞门。 面试官人很nice,没有多余的操作, 并且友好地帮我倒了一杯水。 主要针对简历中的项目,以及java基础进行面试。 难度也是循序渐进, 说实话因为是第一家面试, 我确实很多地方没有准备好,但是还是感谢面试官给我机会。 感受:之前感觉银行可能比较水, 但是感觉各方面都挺与时俱进的, 待遇和人文也很有竞争力。 某信应该有大几百人的研发团队,各方面应该都不输于D轮的互联网公司。 总体是比较赞的。 |
某动 | Boss | 线上笔试 |
3道Codility,英文,大概3h限时, 我应该1h就写完了,用例跑通我就提交了,但是只有一道题ac。(很奇怪,也没有错误用例的提示,和LeetCode有些不一样) 然后hr还是让我去面试, 我拒绝了,可能是我当时已经对这家公司没有太大兴趣了。 |
|
某见科技 | Boss | 笔试+面试 |
一家AI创业公司, 看jd介绍不错就去了。 最后发现是在一个很偏,有点破的创业园,里面环境有点像家乡的网吧。 笔试3道很简单的题, 面试也没什么深度,面试官说实话感觉水平比较一般。 总体技术和互联网差别很大, 我当时也是抱着练手的态度过去。 所以也没下文了。 |
|
某vo | 金融 | Boss | 视频面试 |
1面视频面,难度循序渐进,两位面试官提问。 面试官说第二天hr联系我,结果也没联系。我也没问了。 主要是因为某vo在深圳,我在北京,可能我也不是很想换城市,后面投的都是在北京了。 |
某团 | -- | Boss | 3+0 拿到offer |
某团的环境感觉就是标准的互联网风格, 面试官也很务实友好, 难度循序渐进,二面会问一些底层,并发的理解。 某团无论是从技术沉淀还是我面试团队的潜力, 都是我很心仪的。 很幸运也给了我一个不错的定级和待遇。 |
某米 | 某品 | Boss | 2面撤了 |
说实话,我开始是不想投某米的,但是考虑到我是湖北人,可能回武汉。 但是!!!我面试之前应该在脉脉上搜一搜这个部门的。 这个部门位于清河一个挺偏的地方, 周围仿佛回到了18县小乡镇。 面试官也是low爆炸了,一面面试官穿了一个脱鞋,让我在楼下等了20min,前台态度也不好。 然后竟然去了一个茶吧台面试。不过一面面试官总体态度还行。(某米不提供饮水,面试官带我去饮料机买了瓶汽水,当然是我自费,从某米出来我就有了带水的习惯了。) 二面简直是个活宝,上来站着问,你懂hashmap吗, 我简单答了一下数组+链表,然后按理应该往碰撞,或者并发的方向继续问, 结果坐下,抖腿,问什么抓包的原理,然后扯的乱七八糟的。 最后憋了一分钟吧,出了一个很无聊的题(LeetCode第十题)。 我实在不想浪费彼此时间,就直接走了。 某米本身在我心中还是个挺有态度的公司,和雷某总也是老乡。 哎,真是刷新了我的三观。 |
某脉 | 效能 | Boss | 2+1 |
某脉我觉得公司和产品一样nice, 位于768,环境很安静。 hr笑的很开心,面试官也很有礼节。 他们主后端是用python, java主要做一些离线和效能的工作。 因为第一天3面面试官不在, hr让我第二天过去, 但是由于面试过程中了解到是去做效能平台,财务平台。 秉着发展的考虑,我还是拒绝了。 但是我还是推荐某脉, 小而美。 |
某某跳动 | 某告 | 猎头 | 3+1,拿到offer |
面完某米之后,我觉得我不能在小公司上面浪费时间,同时也有了某团的offer。 于是我把其余的面试都取消了,只剩下了某条和某里。 某条办公环境,位置都很好。 每层都有食堂(请我吃了一顿,很好吃) 同学们给我最大的感受是 年轻,有活力,友好。 还有就是真的忙。 我身边已经有陆陆续续不少同事选择了某条了。 面试难度其实没有传说中的那么难, 不至于手写红黑树,但是基本的数据结构和算法要熟悉,每一面都会写算法。 hr感觉也很尽心尽责。 |
某某巴巴 | 某学 | Boss | 3+1 |
某巴巴的面试总体有点失望,首先hr没预约会议室,导致在休息区面试。 也没有茶水,虽然我自带了。 然后是办公区到处都是屏幕,循环着某云的创业视频。 三面面试中规中矩。 某学本来就不是我投的部门(我投的u某c,不知道咋流过去了,然后让我面试,我也想试一试吧,然后hr说我某蚁简历没过,可我压根没投过) 某里最难的是hr面, 一个hr非要充当心里学家,问你人生高潮是啥, 非常没有礼貌,说话直接打断,也没什么信用,感觉这群hr把某里搞得乌烟瘴气。 特别是hr套路很多, 面完了说没有hc,hc要审批(那你喊我来干嘛) ,然后我有很优秀的同事面过了 (其实也一直拖着没给offer),我说有人拿offer了 ,hr又说人家面的早。让我感觉她就是在刷kpi啥的。 反正这个部门我是不建议去了, 周围拿到某学offer的同事也打算拒了再看看。 |
某马逊 | 物流仓储 | Boss | 还没面 |
4.总结及建议
1.一定要提前准备好,刷一定量的题,特别是现在各大公司都有自己的招聘系统,如果一面就挂了,可能直接就拉黑,后续面试就更难了。
2.关于刷题,大概刷完剑指offer上面的经典题, 或者leetcode前100道应该就够了,我建议有选择的刷,主攻排序,链表,大文件处理这些面试高频的,也有意义的。
3.关于练手,我觉得不要有太大的心里负担, 你去一般公司面试,对于公司可能是一种匹配,但是对个人可是一次很好的自我认知反省的机会,甚至会改变后续的很多结果。
我们结合对行业的了解,如下公司可以说小而美(其实也是大独角兽了),本身就值得加入,面试也有很多收获: 某辅导,某脉,某探,瓜某,某vo互联网。
当然拿大厂的边缘部门练手也未尝不可,就是有风险有记录。
当然也有一些黑名单,面试官迷之自信,态度傲慢,技术浅显, 建议大家面试前脉脉一下。。
最后一棒子打死,感觉位于清河的公司,可能都不太利于个人生活和发展。
4.关于基础,我在下面附上一些前辈整理好的url。一定要夯实打捞。
5.关于面试礼仪,我觉得面试礼仪是衡量双方的重要标准, 面试者要注重自己的仪表整洁,谈吐礼貌自然。 可以从公司面试官的行为判断出公司的大体人员素质,我个人比较看重公司行政或者面试官是否能给瓶矿泉水或者倒杯水,我认为这是尊重一个面试者的基本表现,虽然后来我都是自己带水。 我面试中就某米和某里没有提供(并且某里某学是饭点约去面试,也不管饭,饿着肚子从5点面到9点多),然后就是双方是否守时,我一般提前20分钟到,提前10分钟给hr打个电话。
6.关于面试难度,我觉得正常应该是围绕简历和基础循序渐进,一上来手撕红黑树,给个hard基本要dp的,或许不是真心想招人的。
当然,即使难点也不要慌, 表达好自己的思考过程,展现自己一个综合的素质 ,即使错了也不会被一票否定。
7.关于面试技巧, 之前看了有的前辈说尽量把面试官往自己熟悉的领域带,有一点道理, 但是我没有刻意这样操作过, 不会的一般思考一下,直接说不确定/没研究过/不会,然后说一个可能的原理,如果合理我认为也能体现一种技术功底和应变能力。
其他的想到在整理吧。
5.面试题+基础
各家的面试题其实都大同小异, 掌握基础和原理,走到哪都不怕。
基础
leetcode上有一些总结,star数非常高了。贴上url
https://github.com/CyC2018/CS-Notes
https://github.com/Snailclimb/JavaGuide
这两个大概只是个提纲,如果是高级职位,深度可能不够,具体的还得看书。
另外强烈推荐 http://www.iocoder.cn/ 芋道,我的面试题很多都是从上面找的。平时对提高也有帮助。
reids
redis的话,我推荐《Redis深度历险:核心原理和应用实践》 和《redis设计与实现》
- 知道redis吗,redis是如何做持久化的
- 介绍下redis的特点,redis的基本数据结构,数据持久化方式,主从之间如何同步;
- 导致redis性能瓶颈的操作
- redis有哪些接口
- Redis的实现模式;
- redis为什么这么快?
java-core
基础的话主要看源码吧, collection和juc里面的。 然后就是《java编程思想》和《java核心技术 卷1.2》(有很多过时的章节直接跳过即可)
- 1、List 和 Set 的区别
- 2、HashSet 是如何保证不重复的
- 3、HashMap 是线程安全的吗,为什么不是线程安全的(最好画图说明多线程环境下不安全)?
- 4、HashMap 的扩容过程
- 5、HashMap 1.7 与 1.8 的 区别,说明 1.8 做了哪些优化,如何优化的?
- 6、final finally finalize
- 7、强引用 、软引用、 弱引用、虚引用
- 8、Java反射
- 9、Arrays.sort 实现原理和 Collection 实现原理
- 10、LinkedHashMap的应用11、cloneable接口实现原理
- 12、异常分类以及处理机制
- 13、wait和sleep的区别
- 14、数组在内存中如何分配
java-并发
我推荐《java并发编程艺术》 我觉得比 《java并发编程实战》更好理解一点。
- 1、synchronized 的实现原理以及锁优化?
- 2、volatile 的实现原理?
- 3、Java 的信号灯?
- 4、synchronized 在静态方法和普通方法的区别?
- 5、怎么实现所有线程在等待某个事件的发生才会去执行?
- 6、CAS?CAS 有什么缺陷,如何解决?
- 7、synchronized 和 lock 有什么区别?
- 8、Hashtable 是怎么加锁的 ?
- 9、HashMap 的并发问题?
- 10、ConcurrenHashMap 介绍?1.8 中为什么要用红黑树?
- 11、AQS
- 12、如何检测死锁?怎么预防死锁?
- 13、Java 内存模型?
- 14、如何保证多线程下 i++ 结果正确?
- 15、线程池的种类,区别和使用场景?
- 16、分析线程池的实现原理和线程的调度过程?
- 17、线程池如何调优,最大数目如何确认?
- 18、ThreadLocal原理,用的时候需要注意什么?
- 19、CountDownLatch 和 CyclicBarrier 的用法,以及相互之间的差别?
- 20、LockSupport工具
- 21、Condition接口及其实现原理
- 22、Fork/Join框架的理解
- 23、分段锁的原理,锁力度减小的思考
- 24、八种阻塞队列以及各个阻塞队列的特性
- 单机上一个线程池正在处理服务,如果忽然断电了怎么办(正在处理和阻塞队列里的请求怎么处理)?
- 为什么要使用线程池?
- 线程池有什么作用?
- 说说几种常见的线程池及使用场景。
- 线程池都有哪几种工作队列?
- 怎么理解无界队列和有界队列?
- 线程池中的几种重要的参数及流程说明。
JVM
JVM应该就一本《深入理解JVM虚拟机》 就够了, 但是我买的版本比较老,1.8以后内存区域做了一些改动,自己的得知道。
- 1、详细jvm内存模型
- 2、讲讲什么情况下回出现内存溢出,内存泄漏?
- 3、说说Java线程栈
- 4、JVM 年轻代到年老代的晋升过程的判断条件是什么呢?
- 5、JVM 出现 fullGC 很频繁,怎么去线上排查问题?
- 6、类加载为什么要使用双亲委派模式,有没有什么场景是打破了这个模式?
- 7、类的实例化顺序
- 8、JVM垃圾回收机制,何时触发MinorGC等操作
- 9、JVM 中一次完整的 GC 流程(从 ygc 到 fgc)是怎样的
- 10、各种回收器,各自优缺点,重点CMS、G1
- 11、各种回收算法
- 12、OOM错误,stackoverflow错误,permgen space错误
- 说一下对jvm的理解,jvm的组成部分,各个部分的存储内容以及常见的jvm的问题排查步骤。
- 对JVM熟不熟悉?简单说说类加载过程,里面执行的那些操作?
- JVM方法区存储内容 是否会动态扩展 是否会出现内存溢出 出现的原因有哪些。
- 介绍介绍CMS。
- 介绍介绍G1。
- 为什么jdk8用metaspace数据结构用来替代perm?
- 简单谈谈堆外内存以及你的理解和认识。
- JVM的内存模型的理解,threadlocal使用场景及注意事项?
- JVM老年代和新生代的比例?
- jstack,jmap,jutil分别的意义?如何线上排查JVM的相关问题?
- Java虚拟机中,数据类型可以分为哪几类?
- 怎么理解栈、堆?堆中存什么?栈中存什么?
- 为什么要把堆和栈区分出来呢?栈中不是也可以存储数据吗?
- 在Java中,什么是是栈的起始点,同是也是程序的起始点?
- 为什么不把基本类型放堆中呢?
- Java中的参数传递时传值呢?还是传引用?
- Java中有没有指针的概念?
- Java中,栈的大小通过什么参数来设置?
- 一个空Object对象的占多大空间?
- 对象引用类型分为哪几类?
- 讲一讲垃圾回收算法。
- 如何解决内存碎片的问题?
- 如何解决同时存在的对象创建和对象回收问题?
- 讲一讲内存分代及生命周期。
- 什么情况下触发垃圾回收?
- 如何选择合适的垃圾收集算法?
- JVM中最大堆大小有没有限制?
- 堆大小通过什么参数设置?
- JVM有哪三种垃圾回收器?
- 吞吐量优先选择什么垃圾回收器?响应时间优先呢?
- 如何进行JVM调优?有哪些方法?
- 如何理解内存泄漏问题?有哪些情况会导致内存泄露?如何解决?
Spring
spring的话,感觉现在问的少了, spring cloud会问的比较多, 应该算在微服务/分布式的知识点里面。
- 1、BeanFactory 和 FactoryBean?
- 2、Spring IOC 的理解,其初始化过程?
- 3、BeanFactory 和 ApplicationContext?
- 4、Spring Bean 的生命周期,如何被管理的?
- 5、Spring Bean 的加载过程是怎样的?
- 6、如果要你实现Spring AOP,请问怎么实现?
- 7、如果要你实现Spring IOC,你会注意哪些问题?
- 8、Spring 是如何管理事务的,事务管理机制?
- 9、Spring 的不同事务传播行为有哪些,干什么用的?
- 10、Spring 中用到了那些设计模式?
- 11、Spring MVC 的工作原理?
- 12、Spring 循环注入的原理?
- 13、Spring AOP的理解,各个术语,他们是怎么相互工作的?
- 14、Spring 如何保证 Controller 并发的安全?
Netty
我不会
分布式相关
主要考察对cap和base的理解吧, 我没有系统学习过,主要靠平时的积累。
- 1、Dubbo的底层实现原理和机制
- 2、描述一个服务从发布到被消费的详细过程
- 3、分布式系统怎么做服务治理
- 4、接口的幂等性的概念
- 5、消息中间件如何解决消息丢失问题
- 6、Dubbo的服务请求失败怎么处理
- 7、重连机制会不会造成错误
- 8、对分布式事务的理解
- 9、如何实现负载均衡,有哪些算法可以实现?
- 10、Zookeeper的用途,选举的原理是什么?
- 11、数据的垂直拆分水平拆分。
- 12、zookeeper原理和适用场景
- 13、zookeeper watch机制
- 14、redis/zk节点宕机如何处理
- 15、分布式集群下如何做到唯一序列号
- 16、如何做一个分布式锁
- 17、用过哪些MQ,怎么用的,和其他mq比较有什么优缺点,MQ的连接是线程安全的吗
- 18、MQ系统的数据如何保证不丢失
- 19、列举出你能想到的数据库分库分表策略;分库分表后,如何解决全表查询的问题
- 20、zookeeper的选举策略
- 21、全局ID
mysql:
《Mysql技术内幕-innodb存储引擎》就够了。
- mysql索引的实现原理
- Innodb中,什么是聚集索引,非聚集索引,他们是什么关系
- 插入一条记录时,聚集索引和非聚集索引是如何修改的
- 建立索引的标准是什么
- 查看 SQL 是不是使用了索引?(有什么工具)
- SQL 索引的顺序,字段的顺序
- MySQL 分页查询语句,mysql分页有什么优化