面经收集
本文主要是为了总结记录下我的秋招之路,毕竟现在才发面经,也太特么晚了吧。当然,如果能为他人提供哪怕微微的帮助,我也会非常高兴。先做自我介绍,研究生,方向Java开发,无实习,无项目,无获奖,无竞赛,成绩差,基础差,准备时间晚,真菜得一笔,仅有的优势就是学历还行,起码不会被卡学历。另外,心态好,学习能力强,面经看得多,个人总结到位了。最后的结果超出预期的好,毕竟我的预期只是年薪三十万,达到街薪即可。行文主要分为三个部分:个人历程、基础面经总结以及手撕代码总结。
个人历程
首先,我犯了一个极其严重的错误,那就是准备的太晚,没敢参加提前批,好多公司提前批都已经招得差不多了,正式批hc太少了。其次,实验室不让实习,没有实习经历,也没有可深谈的项目,太不利于秋招了。室友都是微软实习转正,太羡慕嫉妒了。我时常在想,如果我曾实习过,是不是会顺利很多?
我正式参加简历投递已经是九月初了。简历投了三四十,笔试做了二三十。印象深刻的有两天,其中一天堆了7个笔试,我做了5个。还有一天,4个笔试加一个面试,而且其中两个笔试是并行的。并行的意思是,贝壳宣讲会和华为笔试都是晚上7点,所以我带着笔记本去参加宣讲会, 华为笔试40分钟提前交卷,然后接着写贝壳的现场笔试。我自认为笔试做得还行,但面试真的没几个,也就京东(三面加一块不到一小时)、猿辅导(二面代码写得慢挂)、美团(二面莫名其妙挂)、bigo(一面挂, 女面试官下手太狠了)、cvte(面试自我感觉良好,然后反手被挂)、滴滴(三面因为一个非常简单的问题被挂,太特么丢人了,就不说了)。这是我国庆之前的情况,非常的失落以及慌张,感觉大厂都不怎么招人了,小厂只笔试不面试,有面试也是刷KPI的。最让我烦的是快手,我笔试全对,然后挂了。哥们听我遭遇之后,笔试干脆不做,然后快手邀他去面试,这特么跟谁说理去?这时,我甚至已经做好了春招再战的准备。
我真的非常感谢字节跳动。大家都说头条早已招满,所以即使头条连续给我发两次笔试链接,我都选择了其他家的笔试。然而他们依然打电话约面试。我将我秋招最后也是最大的希望都放在了头条上。国庆期间,我在牛客网上刷了很多头条的面经,把基础题和代码题全部总结了下, 不会的全记录下来慢慢解决。其实,国庆七天也就努力了三天,后四天全玩了……国庆之后的那周,是我最努力的一周。因为,一起抱团取暖、同样苦比的哥们被头条收了,只剩我一人继续苦比了。老哥回头望,笑我还不快跟上。好吧,努力去跟上。那周,我就憋着一股气去学习,去面试,就为了通过下周一的头条面试。那周,我依次面了拼多多一面,招行三面,度小满三面,自我感觉都挺好的。在此我感谢度小满,他给了我很大的信心。度小满三面都是技术面,难度都不低,面试官人都很好。二面面试官在肯定了我之后,告诫我要注意表达,虽然技术面不怎么看注重表达能力,但第三面会考察,要注意一下。同时又指点了我个人学习要注意的一些事项。第三面面试官,嚯~,特别漂亮的女面试官。漂亮且气质,用一个词来形容就是精致,精致的面孔,精致的发型,优雅的谈吐。而且还是个技术大拿。她给我讲了10多分钟的金融知识,在得知我无offer的慌张后,她肯定了我的水平,说我的情况拿五个完全没问题,根本不用慌。并劝告我,以后在选择offer的时候,要注重个人的发展,一定要先搞清楚自己感兴趣的方向是什么,不要什么都没弄明白就一股脑扎进去。然后就是字节跳动抖音部门的面试,三面下来,又褪了层皮,感觉再也不想面试了,心累了。度小满加抖音这两天六面,真的耗光了我所有的精力。幸运的是,第二天抖音hr就微信偷偷告诉我面试通过了,慢慢等oc吧。然后我就傲娇得拒绝了云从、奇安信、小米、贝壳的面试。抱着爱咋咋地得悠然心态,走完了拼多多、华为、有道的面试流程。
嗯,最后我选择了拼多多。
基础总结
关于一面二面的基础部分,只要准备的足够充分,百分之九十的问题都能完全答对。这里面真的丝毫技术含量都没有,全靠背。在我所有的面试里,只有头条二面是靠背解决不了的,因为他总能精准找到你的知识盲区,明明这块我自认为复习的足够全面,但依然被他怼得说不出话来。即使再给我两星期时间准备,我也很难复习到他所问的那些点。但比较好的是,准备得多了,即使被抓着盲点怼,也能够现场尝试给出猜测,不管对不对,起码能体现出相关知识储备以及思考能力。关于基础知识的总结,网上有很多,最好的就是github上JavaGuide那老哥。我的建议是,将他整理的PDF打印出来,好好看好好学。最后,再按照知识点用自己的语言习惯总结一下,务必简洁扼要有序,面试的时候直接按照总结的背起就行。他总结的并不能完全覆盖所有面试点,这就需要自己去不断的看别人的面经,整理一下他人被提问的问题,对于那些不会的、说不清的又很重要的问题,去网上搜答案,看懂之后再自我总结。不断的在面试和面经中,迭代自己的知识点总结。下面我分类将我认为比较重要的问题列出来。
网络:
1、OSI七层模型与TCP/IP 五层模型,
2、常见应用层协议和运输层、网络层协议,以及硬件如路由器之类在哪一层
3、TCP与UDP区别和应用场景,基于TCP的协议有哪些,基于UDP的有哪些
4、TCP可靠传输的保证,拥塞控制目和过程
5、TCP粘包现象原因和解决方法
6、TCP三次握手过程以及每次握手后的状态改变,为什么三次?为什么两次不行?如果你的答案是防止已失效的请求报文又传送到了服务端,建立了多余的链接,浪费资源,但这个答案被否定了,你还能给出什么答案?
7、TCP四次挥手过程以及状态改变,为什么四次?CLOSE-WAIT和TIME-WAIT存在的意义?如何查看TIME-WAIT状态的链接数量?为什么会TIME-WAIT过多?解决方法是怎样的?
8、TCP、UDP、IP、以太网报文格式以及重要字段,报文从一端到另一端传递的过程。
9、浏览器输入URL并回车的过程以及相关协议,DNS查询过程。
10、HTTP1.0、1.1、2.0之间的区别
11、HTTP与HTTPS之间的区别,HTTPS链接建立的过程,了解对称加密算法和非对称加密算法不?
12、HTTP请求有哪些,多说点。Post和get区别。
13、HTTP常见响应状态码,从1xx到5xx都要说。如304,301,302,504,
14、重定向和转发区别
15、cookie和session区别。
操作系统:
1、进程和线程的区别
2、协程呢?
3、进程间通信方式IPC
4、用户态和核心态
5、操作系统分配的进程空间是怎样的?线程能共享哪些?
6、操作系统内存管理方式,分页分段以及段页式的优缺点
7、页面置换算法有哪些,FIFO为什么不好?如何改进?LRU思想,手写LRU
8、死锁条件,解决方式。
Java基础
1、面向对象特性介绍、与C++区别
2、多态实现原理
3、抽象类和接口区别,以及各自的使用场景
4、泛型以及泛型擦除。List类型的list,可以加入无继承关系的B类型对象吗?如何加入?
5、Java异常体系
6、反射原理以及使用场景
7、ThreadLocal原理,如何使用?
8、内存泄漏的场景
9、static关键字和final关键字使用情况,一个类不能被继承,除了final关键字之外,还有什么方法(从构造函数考虑)?
10、序列化和反序列化。反序列化失败的场景。
11、ArrayList和LinkedList的区别和底层实现?如何实现线程安全?
12、List遍历时如何删除元素?fail—fast是什么?fail—safe是什么?
13、详细介绍HashMap。角度:数据结构+扩容情况+put查找的详细过程+哈希函数+容量为什么始终都是2^N+JDK1.7与JDK1.8的区别。
14、HashMap如何实现线程安全?ConcurrentHashMap的底层实现?JDK1.7与JDK1.8的区别
15、正则表达式会写吗?
16、设计模式了解吗?
17、linux指令知道哪些?
JVM相关
1、JVM运行时内存划分?PC+虚拟机栈+本地方法栈+堆+方法区+JDK1.7与1.8区别
2、堆内存分配策略
3、Full GC触发条件
4、如何判断对象是否存活?回收对象的两次标记过程。
5、垃圾回收算法以及垃圾回收器介绍,尤其是G1和CMS的优缺点
6、创建一个对象的步骤
7、详细介绍类加载过程
8、双亲委派机制,使用这个机制的好处?破坏双亲委派机制的场景?如何破坏?
9、了解下tomcat的类加载机制
10、JVM性能调优,常用命令,以及工具
多线程并发
1、进程线程区别,线程安全和非线程安全区别
2、线程状态,start,run,wait,notify,yiled,sleep,join等方法的作用以及区别
3、wait,notify阻塞唤醒确切过程?在哪阻塞,在哪唤醒?为什么要出现在同步代码块中,为什么要处于while循环中?
4、线程中断,守护线程
5、Java乐观锁机制,CAS思想?缺点?是否原子性?如何保证?
6、synchronized使用方法?底层实现?
7、ReenTrantLock使用方法?底层实现?和synchronized区别?
8、公平锁和非公平锁区别?为什么公平锁效率低?
9、锁优化。自旋锁、自适应自旋锁、锁消除、锁粗化、偏向锁、轻量级锁、重量级锁解释
10、Java内存模型
11、volatile作用?底层实现?禁止重排序的场景?单例模式中volatile的作用?
12、AQS思想,以及基于AQS实现的lock, CountDownLatch、CyclicBarrier、Semaphore介绍
13、线程池构造函数7大参数,线程处理任务过程,线程拒绝策略
14、Execuors类实现的几种线程池类型,阿里为啥不让用?
15、线程池大小如何设置?
16、手写简单的线程池,体现线程复用
17、手写消费者生产者模式
18、手写阻塞队列
19、手写多线程交替打印ABC
MySQL
1、事务4大特性,一致性具体指什么?这4个特性mysql如何保证实现的?
2、事务隔离级别,4个隔离级别分别有什么并发问题?
3、Mysql默认隔离级别?如何保证并发安全?
4、RR和RC如何实现的?RR使用场景?对比volatile可见性,为什么RR的事务要设计成不能读另一个事务已经提交的数据?
5、隔离级别的单位是数据表还是数据行?如串行化级别,两个事务访问不同的数据行,能并发?
6、存储引擎Innodb和Myisam的区别以及使用场景
7、 介绍Inodb锁机制,行锁,表锁,意向锁
8、介绍MVCC.
9、哈希索引是如何实现的?
10、B树索引为什么使用B+树,相对于B树有什么优点?为什么不能红黑树?要提到磁盘预读
11、聚簇索引和非聚簇索引区别
12、回表查询和覆盖索引
13、如何创建索引?
14、如何使用索引避免全表扫描?
15、Explain语句各字段的意义
16、最左前缀!!联合索引B+树是如何建立的?是如何查询的?当where子句中出现>时,联合索引命中是如何的? 如 where a > 10 and b = “111”时,联合索引如何创建?mysql优化器会针对得做出优化吗?
17、MySQL中一条SQL语句的执行过程
18、数据库几大范式
19、数据库基本查询关键字使用,如left join on,where,beteen and,group by,having,limit,聚合函数等。
20、left join,right join,inner join,outer join的含义及区别
21、mysql主从复制过程,binlog记录格式,复制的异步半同步同步模式区别
22、主从复制或读写分离等数据不一致性问题以及如何解决
23、银行的话,可以会考mysql数据类型,如余额要用decimal
Redis问题:
1、为什么使用Redis
2、分布式缓存和本地缓存有啥区别?让你自己设计本地缓存怎么设计?如何解决缓存过期问题?如何解决内存溢出问题?
3、redis和memcached的区别
4、redis常用数据结构和使用场景
5、Zset底层实现?跳表搜索插入删除过程?
6、redis过期淘汰策略
7、redis持久化机制?都有什么优缺点?持久化的时候还能接受请求吗?
8、redis事务
9、缓存雪崩和缓存穿透,以及解决方法
10、如何保证缓存和数据库的数据一致性?
11、redis是单线程还是多线程?为什么那么快?
12、五种IO模型的区别
13、select、poll、epoll的区别?
14、redis热key问题?如何发现以及如何解决?
15、redis数据分布方式?有什么优点?一致性hash呢?
16、redis主从复制,主从切换,集群
Spring
1、Spring IOC
2、Spring AOP,动态代理
3、Bean生命周期
4、Bean作用域?默认什么级别?是否线程安全?Spring如何保障线程安全的?
5、Spring事务隔离级别和事务传播属性
6、Spring以及Spring MVC常见注解
7、@autowired和@resource的区别,当UserDao存在不止一个bean或没有存在时,会怎样?怎么解决?
8、mybatis如何防止sql注入?$#的区别是什么?传入表明用哪个?
9、Spring MVC工作原理
10、SpringBoot自动配置的原理是什么?介绍SpringBootApplication注解.
11、Mybatis和Hibernate的区别
12、spring中的注解原理?例如事务注解,spring如何根据注解实现事务功能的
13、Spring中用到了哪些设计模式?单例、代理、工厂、适配、观察者之类的说一说就行
大数据和空间限制与系统设计
1、100亿黑名单URL,每个64B,判断一个URL是否在黑名单中
2、2GB内存在20亿整数中找到出现次数最多的数
3、40亿个非负整数中找到没有出现的数
4、40亿个非负整数中找到一个没有出现的数,内存限制10MB
5、找到100亿个URL中重复的URL
6、海量搜索词汇,找到最热TOP100词汇的方法
7、40亿个无符号整数,1GB内存,找到所有出现两次的数
8、10MB内存,找到40亿整数的中位数
9、设计短域名系统,将长URL转化成短的URL.(知乎老哥给出了答案,博客有人根据他的总结了一下,很好)
10、让你系统的设计一个高并发的架构,你会从哪几个方面考虑?
11、一个千万级的APP,你要搞定关注和粉丝列表,你用什么来做。要求最后一个关注的在最前面。新增和取关都要比较快的反馈你怎么做?如果一个人关注了之后,服务器宕机了怎么办?
12、OOD design:计费停车场
13、假设有这么一个场景,有一条新闻,新闻的评论量可能很大,如何设计评论的读和写
14、显示网站的用户在线数的解决思路
项目
如果个人没有好的项目,就用高并发秒杀。B站搜高并发秒杀,有慕课网视频,讲的很好。Github搜秒杀,有代码,跑一遍。有时间自己写一遍,没时间就看懂就好。然后准备问题,不要求每个功能都实现的特别好,但一定要多考虑系统可能出现的问题,因为很多人都是这个项目,你考虑的多,自然就显得稍微那么好了点。
1、如何解决超卖?mysql锁+redis预减库存+redis缓存卖完标记
2、如何解决重复下单?mysql唯一索引+分布式锁
3、如何防刷?IP限流+验证码
4、热key问题如何解决?redis集群+本地缓存+限流+key加随机值分布在多个实例中
5、消息队列的作用?如何保证消息的不丢失?异步削峰;发送方开启confirm+消息队列持久化+消费方关闭自动ACK,确保消费成功之后自动调用API进行确认。
6、缓存和数据库数据一致性如何保证?秒杀项目不用保证,其他项目就用延时双删或者先更新数据再是缓存失效,为防缓存失效这一信息丢失,可用消息队***保。
7、压测没有?用什么压测?什么情况?
8、系统瓶颈在哪?如何查找,如何再优化?