微信公众号【程序员江湖】
作者黄小斜,斜杠青年,某985硕士,阿里研发工程师,于2018 年秋招拿到 BAT 头条、网易、滴滴等 8 个大厂 offer
个人擅长领域 :自学编程、技术校园招聘、软件工程考研(关注公众号后回复”资料“即可领取 3T 免费技术学习资源)
对于BAT三家公司的面经,作者总结了参考答案,具体文章请参考链接:https://xiaozhuanlan.com/java-coder
腾讯SNG
后台开发工程师
大概是8月初投的简历,当时没有选事业群,第二天直接被sng捞了,抓着我一顿面试。
一周内就面完了三次面试,接着就开始无尽的等待,整整等了三周左右,终于完成了四面和HR面。
整个过程还是比较曲折的,技术面试的难度也挺大的,不过他们部门也是Java线,所以还比较有的聊。结果目前还不知道。
1一面
一面:
1 有序数组排序,二分,复杂度
2 常见排序算法,说下快排过程,时间复杂度
3 有N个节点的满二叉树的高度。1+logN
4 朋友之间的点对点关系用图维护,怎么判断两人是否是朋友,并查集,时间复杂度,过程。没讲清楚
1. 初始化元素
2. 实现元素与元素间的联合操作
3. 实现查找元素所在树的根节点
4. 解决一个问题,判定两个元素是否在同一棵树上(两个元素是否相互连接)
5 单元点最短路的方法,时间复杂度
6 如何实现关键字输入提示,使用字典树,复杂度多少,有没有其他方案,答哈希,如果是中文呢,分词后建立字典树?
7 hashmap的实现讲一下吧,讲的很详细了。讲一下红黑树的结构,查询性能等。
8 Java中的垃圾回收讲一下,讲了分代,gc算法,gc root可达性分析等
9 讲一下两个项目你都做了什么把。
10 除了代码之外你还学习了什么技术,框架。
11 死锁是怎么产生的
12 线程和进程的区别
13 进程的通信方式
14 CPU的执行方式
15 代码中遇到进程阻塞,进程僵死,内存泄漏等情况怎么排查。通过ps查询状态,分析dump文件等方式排查。
16 Linux了解么,查看进程状态ps,查看cpu状态 top。查看占用端口的进程号netstat grep
17 10g文件,只有2g内存,怎么查找文件中指定的字符串出现位置。MapReduce分割文件处理。
他说可以用cat | grep 管道处理。
2二
二面:
1 快排的时间复杂度,冒泡时间复杂度,快排是否稳定,快排的过程
2 100w个数,怎么找到前1000个最大的,堆排序,怎么构造,怎么调整,时间复杂度。
3 一个矩阵,从左上角到右下角,每个位置有一个权值。可以上下左右走,到达右下角的路径权值最小怎么走。
先说了一下dfs递归实现。面试官说要优化。
说了一下用迪杰斯特拉的思路,说可以。
4 四辆小车,每辆车加满油可以走一公里,问怎么能让一辆小车走最远。说了好几种方案,面试官引导我优化了一下,但是还是不满意,最后他说跳过。
5 hashmap的实现,hashtable,concurrenthashmap实现。
6 MySQL的索引,B+树性质。
7 Linux的cpu 100怎么排查,top jstack,日志,gui工具
8 Linux大文件怎么查某一行的内容。
9 Redis内存数据库的内存指的是共享内存么
10 Redis的持久化方式
11 秒杀系统的架构设计
3
三面:
1 十亿个数的集合和10w个数的集合,如何求它们的交集。
集合的数字不重复。
我讲了两次循环,两次hash,以及排序或者合并等方式。。都不对。后来面试官说是对小数组做hash,然后遍历大数组即可。我完全想错方向了。
2 十亿和数找到前100个最大的,堆排序,怎么实现,怎么调整。
3 TCP和UDP的区别,具体使用场景呢。
4 TCP四次挥手讲一下过程,最后一次ack如果客户端没收到怎么办。
5 对于socket编程,accept方法是干什么的,在三次握手中属于第几次,可以猜一下,为什么这么觉得。
6 Linux操作系统了解么,了解一点点,就没问了。
7 对于单例模式,有什么使用场景了,讲了全局id生成器,他问我分布式id生成器怎么实现,说了zk,问我zk了解原理不,讲了zab,然后就没问啦。
8 除了单例模式,知道适配器模式怎么实现么,有什么用
9 回到网络,刚才你说到直播场景,知道直播的架构怎么设计么,要点是什么,说了几个不太对,他说要避免广播风暴,答不会。
10 Redis和MySQL有什么区别,用于什么场景。
11 问了一下最近看什么书,什么时候开始写博客的
12 问了还有几轮面试,他说这轮我可以过,有点小惊喜
4
四面:
三面过了半个多月,终于安排四面了。
1 自我介绍
2 项目,收获
3 Linux了解哪些,基础命令和知识。问我proc文件系统了解么,答不了解。
4 TCP和UDP的核心区别在哪,讲了滑动窗口保证可靠有序传输,UDP不可靠。TCP需要连接而UDP不需要。
5 TCP的四次挥手,time wait状态有什么意义。
6 说完这个他问我有什么想问他的了。
7 我问他为什么隔了这么久才面试,而且之前三面都只是初试,然后他说最近他在休假,所以就。。。害我担心了好久。他说接下来等HR面就行了。
5
HR面:
1 自我介绍
2 实习收获
3 台湾交流体验
4 之前实习公司的情况,拿到offer了吗,会如何选择呢
5 排一下公司,部门,薪资和城市等因素。
6 你的优缺点,如何改进
7 学生时代最成功的事
8 你的预期薪资
阿里中间件研发面经
本文首发于微信公众号:程序员江湖
研发工程师(Java)
我参与了阿里巴巴中间件部门的提前批面试,一共经历了四次面试,拿到了口头offer。这是我的面经,在这里分享给大家。
一面:
1 自我介绍
2 项目中做了什么,难点呢。
3 Java的线程池说一下,各个参数的作用,如何进行的。
4 Redis讲一下
5 分布式系统的全局id如何实现。用zookeeper如何实现的呢,机器号+时间戳即可。
6 分布式锁的方案,redis和zookeeper那个好,如果是集群部署,高并发情况下哪个性能更好。
7 kafka了解么,了解哪些消息队列。
8 想做业务还是研究。
9 然后出了一道题,linux的访问权限是rwx格式的。使用一个类支持访问权限的增删改查,并且注意使用的数据格式以及方法效率,规范。给了一个多小时写题。
耗时将近30分钟。
二面:
1 介绍你做的项目和其中的难点。
2 上次面试官问的问题,反射的作用是什么。
3 数据仓库,多线程和并发工具等。
4 私有云,docker和k8s等。
5 了解哪些中间件,dubbo,rocketmq,mycat等。
6 dubbo中的rpc如何实现。
7 自己实现rpc应该怎么做
9 dubbo的服务注册与发现。
10 听说我是非科班,于是问了些排序算法
耗时将近30分钟。
三面:
三面不是面试,而是笔试,耗时三个小时,考的是Java核心的基础。但是好像不能透题,就不说了。都挺有难度的。
大概说一下就是有几个考点,Java并发的知识点,集合类,线程池,多线程之间的通信等。
HR面:
聊人生谈理想,HR小姐姐非常温柔,交流十分愉快。30分钟。
百度研发面经
本文首发于微信公众号:程序员江湖
百度智能云
软件研发工程师
百度今年的提前批有点奇怪,好像都不走流程,牛客上好几个百度内推的帖子,我投了几个,基本上都是百度智能云的。
然后这些部门都安排了面试,没有冲突,所以没有动静的小伙伴可以投投别的部门试试。
下面是我的两篇面经,后续会继续更新,每个部门侧重点不太一样。
百度智能云研发岗
好像是做控制台方面的组
一面:
1自我介绍,项目
2 static关键字有什么用,static修饰不同东西时有什么作用,内部类用static修饰和不用static修饰有何区别。
3 hashmap,hashtable,concurrenthashmap区别和场景
4 volatile关键字有什么用
5 jvm分区讲下,作用讲下,gc算法讲一下,gc是否会有停顿或者延迟。
6 讲一下OOM和内存泄漏的例子,为什么有GC还会出现内存泄漏和内存溢出呢
7 线程和进程的区别,通信方式的区别。
8 悲观锁和乐观锁,说一下Java和数据库分别怎么实现的。
9 数据库索引说一下,除了B+树索引还有什么索引。
10倒排索引说一下,如果关键字很多,怎么优化。使用前缀树和hashmap优化。
11 前缀树的结构和原理说一下。
12 浏览器发起http请求过程,越详细越好。
13 缓存和数据库的一致性怎么保证
14 网上写代码,写了一个快排
15 没了。
二面:
1 自我介绍
2 项目中难点,用到的技术
3 多线程,说一下线程的状态和状态转换,详细问
4 多线程的sleep方法和wait方法为什么来源不同,一个是object方法,一个是Thread的方法。
5 为什么object的wait和notify必须在同步块中使用,不在同步块使用会报错么,编译报错还是运行报错。
6 jvm讲一下gc吧,两个对象的引用循环依赖,会不会被垃圾回收,什么情况下会什么情况下不会呢
7 GC root是哪些位置呢,我说记不起来,他说你不用记,其实就是运行时的一些对象和变量,比如局部变量表,方法区的元数据比如fianl,static变量,本地方法栈执行的方法。
8 数据库了解哪个。Redis说一下为什么是单线程的,不会很慢么,有什么好处。
9 Redis的IO请求模型,是不是IO多路复用呢。
10 Spring的interceptor和filter有什么区别。我说没区别,错!
11 网络这块,说一下dns请求的过程吧,dns是否会访问缓存呢,缓存在本地和浏览器,还有dns服务器上是不是都有。
12 get和post的区别讲一下,底层的实现有区别么,都是基于TCP,那么如何限制get的url长度,在哪一层限制的。
13 数据结构熟么,讲一下树和图吧,树的层次遍历使用什么结构,相应的图的遍历呢。讲讲最小生成算法,还有迪杰斯特拉。
14 数组,找到唯一一个出现两次的数。
刚开始听错,说了位运算。
a 然后讲了数组计数,hash计数,排序比较。
b 然后面试官说条件给的是1到N-1的N个数字,重新想一下。
c 说了根据数组位置和数字比较进行判断。面试官最后说可以用相加求差值来判断。
15 一个10000以下的数组,内存够。里面只有1,2,3。排下序。
a 普通排序O(nlogn)
b 荷兰旗问题,双指针解决。O(N)
c 统计数量,重放数组O(2N)
d 另外搞一个数组,把1放头,3放尾,也是双指针。O(N)。空间复杂度O(N)
16 没了。
全程50分钟
三面HR
巴拉巴拉巴拉。基本上问题都大同小异。
百度智能云 数据库部门
一面:
1 数据库的事务,四个性质说一下,分别有什么用,怎么实现的。一致性没讲好。
2 讲到了redo和undo日志,问我分别有什么用,说redo日志说错了。
3 数据库的隔离性如何保证,使用悲观锁和乐观锁有何区别。MVCC的设计目的是什么,怎么使用版本号判断数据的可见性。
4 问了一道算法,1到N的所有数字,按照字典序打印,怎么做。
说了用数组排序,问复杂度,扯了半天。
怎么优化,按照数字特征顺序打印,问这个东西和什么结构比较像。提示是树,然后说了个多叉树,问我怎么实现,最后其实使用dfs遍历树的每个分支。
5 多线程并发的同步实现,有两个方法,每个方法里有a部分代码和b部分代码,我要让两个线程分别执行两个方法,并且让他们运行完a部分代码再一起向下执行,如何实现。
6 我说了用cyclicbarrier实现,互相等待await。
然后他问我怎么用信号量实现,并且提示可以再用一个线程。
然后我说了个方案。
7 问了项目
8 如何把优化递归的代码
改成尾递归或者循环。
面试官说不是,引导说用栈实现递归。
问我栈中需要压入哪些数据。他说应该是方法参数,返回值,以及返回地址。
二面:
1 自我介绍,项目 10分钟过去
2 服务器如何负载均衡,有哪些算法,哪个比较好,一致性哈希原理,怎么避免DDOS攻击请求打到少数机器。
3 TCP连接中的三次握手和四次挥手,四次挥手的最后一个ack的作用是什么,为什么要time wait,为什么是2msl。
4 数据库的备份和恢复怎么实现的,主从复制怎么做的,什么时候会出现数据不一致,如何解决。
5 今天面试太多了,记不清了。。。
6 开源的技术看过用过么,分布式存储的了解么。
7 想做什么方向的开发。
8 Linux查看cpu占用率高的进程
9 查看占用某端口的进程和某进程监听的端口
10 如何查询日志文件中的所有ip,正则表达式
三面(8.3号更新):
数据库部门真的很严格,问题都挺难的。
1 讲一下项目
2 平时了解什么操作系统
Linux,说一下Linux排查问题常用的命令,ps,top,netstat,free,du等等
3 Linux的内存管理算法,问了一下是不是页面置换算法,他说是。
说了lru和fifo,问我lru有什么缺点,没答上来。
4 Linux的文件系统了解么,讲了一下inode节点,文件和目录的原理。他问我了不了解具体的文件系统ext2,ext3,答不会。。
5 进程通信方式有哪些,问我分别怎么使用,管道有哪些类型,各有什么优缺点。
6 问我服务器硬件了解么。。一脸懵逼,问了我懂不懂Raid,瞎扯了几句就说不懂了。
7 shell了解么,没怎么写过。
8 听说你会Java,说一下JVM内存模型把,有哪些区,分别干什么的
9 说一下gc算法,分代回收说下。
10 设计模式了解么,说了7种,问我分别怎么用,实际应用过吗,稍微扯了一下。
11 MySQL的引擎讲一下,有什么区别,使用场景呢。
12 查询最新的10条数据,想了好一会,order by id desc limit 10
13 MySQL的union all和union有什么区别,我瞎掰了一下,应该不对。
14 MySQL有哪几种join方式,底层原理是什么,答不会,只知道表现形式。
15 Redis了解哪些啊,数据结构和基本原理把。
问我Redis怎么做集群,答了主从哨兵和cluster。
Redis的持久化怎么做,aof和rdb,有什么区别,有什么优缺点。
16 Redis使用哨兵部署会有什么问题,我说需要扩容的话还是得集群部署。
17 分布式系统了解么,说一下Hadoop了解啥。
我说基本组件稍微了解过,简单搭过环境。
18 MapReduce的combiner干啥的,我说是合并结果的,问我啥时候会用到,答不知道。
19 Hadoop分发任务时,有个job失败了,hadoop会怎么处理,我答不知道,猜是会继续执行。。
20 hadoop分发任务,如果有一个节点特别慢拉慢了整体速度怎么办。我猜测是通过yarn分配相同的资源给每个任务,可以避免这种情况,他好像不太满意。
21 hadoop答得很烂。问了我两个10g文件比较,2g内存,重复率很高,筛选出不同的内容。我说拆成十份hash,每份两两比较hash的结果集,貌似他说OK。
22 排序算法了解哪些,巴拉巴拉。
23 用队列计算一个树的高度,我说用层次遍历记录节点高度。
24 一个黑名单集合,数据量很大,快速查询一个值是否在集合里,怎么设计,我说布隆过滤器。
25 还是上一题,说这个黑名单可能需要动态地增删改,如何设计才能避免访问响应太慢。我没思路,瞎扯了一下加硬件,用内存存,都被驳回了。然后他说算了。
26 上一题的黑名单做成分布式,怎么做。说了分片的方案,根据地址的hash值确定分片所在节点。
27 分布式数据库了解么,我不太明白他问的是啥,说不了解,感觉应该是问数据库的分布式方案。
28 有什么想问的,据他所说还有2-3轮面试,惊了。
全程50分钟,可以说是迄今为止难度最大的一个?
如果你是Java方向的同学,那么我打算向你安利我的另一个微信公众号【Java技术江湖】这是一位阿里Java工程师的技术小站,致力于分享Java后端技术文章,以及这几年学习Java的心得体会,偶尔也记录在阿里成长的点滴,和大家一起在Java学习道路上成长。
大侠,这里有干货!
华为 深信服等研发面经
本文首发于微信公众号:程序员江湖
美图面经:
一面:
1 Java的hashmap
2 Java的多线程技术,线程池
3 Java的jvm讲一下,内存模型,垃圾回收
4 mysql的索引怎么建,优化
5 Linux操作系统了解哪些
6 网络和操作系统问了些基础
7 Redis使用哪些场景
8 数据结构了解哪些,排序的复杂度
9 讲一下项目里的难点,说一下docker。
10 其他忘记了
二面:
1 项目
2 docker和k8s知道哪些,说一下
3 OpenStack用到了哪些组件,说下
4 闲聊其他
5 意向城市
迅雷:
一面:
1 我们是c++和golang,这方面了解么
2 jvm的内存模型和垃圾回收
3 Java并发技术讲一下
4 MySQL数据库相关问题,主从,读写分离,分布式方案
5 Redis的哨兵讲一下
6 负载均衡一般是怎么做的
7 数据结构问了些问题
8 操作系统,网络问了几道题
9 有兴趣转语言么
猿辅导:
一面:
1 讲一下项目
2 项目中的chm和countdownlatch是怎么用的。有没有用到线程池
3 项目中的tomcat部署怎么做的,讲一下基本原理
4 你用到了git,那常用的命令有哪些,pull和fetch merge有什么区别。
5 算法题,A数组和B数组,A数组中数字根据B数组的数字顺序进行排序。
华为优招
cloudbu
研发工程师
一面:
1 项目
2 重构的原因和方式
3 docker和k8s懂哪些说一下
4 jvm了解么
5 jvm加载类是在什么时候
6 如果有重复类加载会发生什么
7 MySQL问了一些
8 闲聊了几句
二面:
1 项目
2 问家庭
3 之前去过台湾交流,问了几句
4 开始问我港台同胞的话题
5 项目有什么创新么,巴拉巴拉
6 论文竞赛有么。没有
7 面试没问题,等着签约吧。
然后我就溜了,还差点把面试官手机错拿了,尴尬
深信服
大数据研发工程师
一面:
1python怎么样
2c语言熟么,问了几个c语言的东西。不会。
3算法,跳台阶,斐波那契数列和dp方式都说了。
4tcp的四次挥手中的time—wait状态何时出现,有什么意义。
5操作系统的fork进程返回什么,应该是子进程号吧。
6没什么问题了。
二面:
1自我介绍
2为什么选这个岗位
3了解hadoop的哪些组件,全部说了一遍。
4讲一下hdfs的写入过程,发请求给namenode,返回一个地址进行写入,写入完告诉namenode,namenode完成副本备份。
5讲一下项目中的难点,多线程,并发工具,并发容器。
6讲一下如何设计一个高并发的秒杀系统
7python了解么,讲一下线程和协程
协程自带上下文,切换不需要刷新cpu上下文和寄存器。更适合并发。协程和线程适用场景的区别。
8没了
三面:
1 介绍
2 问了一下家庭情况和城市意向
3 大学有啥困难和挑战
4 研究生成绩,做了什么
5 评价自己
6 对我司有什么了解
7 加班怎么看
蚂蚁金服研发面经
本文首发于微信公众号:程序员江湖
蚂蚁金服中间件
研发工程师
之前面了阿里中间件的提前批,不过没走流程。同期还面了蚂蚁中间件的两轮面试,被告知不走流程就不能面了,所以也没面完。
后来走了蚂蚁金服财富事业群这边的流程。前几天刚刚面完HR。
正好今天分享一下面经,大家可以多交流交流哈。
1:蚂蚁中间件(面了三次,两次一面,一次二面)
2:蚂蚁财富(1+2+交叉+HR)
1一面
蚂蚁金服中间件一号机
一面:
自我介绍
1Java中的多线程了解么,线程池的增长策略和拒绝策略了解么,说一下。
2讲一下线程增加的过程和拒绝策略的执行。
3讲了一下fixthreadpool的增长策略,然后几种拒绝策略。
4高并发情况下,如何使用线程池,用哪个,问了一下线程结束要多久,是否在下一个线程结束前完成(我想的是cachethreadpool,其实思路错了)。
5表示并发量比较大,所以我说可以考虑并发量是否大于队列长度加上最大线程数量和,如果不超过的话可以是用fixthreadpool。
6并发juc了解么,有哪些线程安全的list。说了个copyonwritelist,想了半天说不出第二个了。尴尬,那就vector把,不是juc里的。
貌似并发包里确实没有其他list啊。
还问了concurrenthashmap1.8的改动。
7HTTP协议了解么,和tcp有什么区别。
8http1.0和2.0的区别。
答了TCP连接复用,加入ssl,以及压缩请求头。
其中哪个更新比较有意义,为什么。我说的是压缩请求头,这样可以优化HTTP服务的性能。
9Java的网络编程,比如NIO和Socket了解么。
说下BIO和NIO的区别把。
我说了BIO的阻塞用法,以及NIO的IO多路复用用法,说了selector,seletedkey,channel等类的使用流程,以及单线程处理连接,多线程处理IO请求的好处。
10说一下NIO的类库或框架
讲了netty,写过服务端和客户端的demo,没有在生产中实践。
1 channelhandler负责请求就绪时的io响应。
2 bytebuf支持零拷贝,通过逻辑buff合并实际buff。
3 eventloop线程组负责实现线程池,任务队列里就是io请求任务,类似线程池调度执行。
4 acceptor接收线程负责接收tcp请求,并且注册任务到队列里。
11倒排索引了解么,我说不了解。
其实就是搜索引擎的基础索引,根据关键字到文档的映射关系建立索引,中文关键字可以使用中文分词,查询时通过关键字来定位索引,并且进行排序后得到文档结果集。
然后面试官说讲一下数据库把,说下sql优化的方式
我说的是MySQL,先讲了一下sql使用索引的优化,然后基于索引说了几条优化方案。
12索引什么时候会失效变成全表扫描
说了联合索引的前缀匹配,跳跃索引,聚合函数,判空和<>这些情况。
13分布式的paxos和raft算法了解么
了解过,但是讲不清楚。
paxos:多个proposer发请提议(每个提议有id+value),acceptor接受最新id的提议并把之前保留的提议返回。当超过半数的accetor返回某个提议时,此时要求value修改为propeser历史上最大值,propeser认为可以接受该提议,于是广播给每个acceptor,acceptor发现该提议和自己保存的一致,于是接受该提议并且learner同步该提议。
raft:raft要求每个节点有一个选主的时间间隔,每过一个时间间隔向master发送心跳包,当心跳失败,该节点重新发起选主,当过半节点响应时则该节点当选主机,广播状态,然后以后继续下一轮选主。
14中间件知道哪些,阿里的dubbo,rocketmq的事务消息,问了TCC回答说这个之前没看明白。
说了mycat实现分表分库,消息队列kafka和rabbitmq等。
15平时看什么书,怎么学习的。还跟我说他们部门3个华科的,校友多多。
16Spring和Springmvc讲一下。讲了Spring的ioc和aop,Springmvc的基本架构,请求流程。
蚂蚁金服中间件二号机
一面:
1 自我介绍
2 讲一下ArrayList和linkedlist的区别,ArrayList的扩容方式,扩容时机。
3 hashmap的实现。
4 NIO了解么,讲一下和BIO的区别,AIO呢。阻塞,非阻塞,异步。具体。
5 你说了解分布式服务,那么你怎么理解分布式服务。
6 你说了解Tomcat的基本原理,了解的是哪一部分,基本架构,connector和container
7 你在项目中怎么用到并发的
8 docker和虚拟机讲一下。
9 有啥想问的
蚂蚁金服中间件二面
1 项目
2 说一下Spring源码把,它的架构,流程。
3 Spring的bean如果要在实例化过程中修改其某一个成员变量,应该怎么做呢。不通过构造方法,并且AOP也并不能实现。
4 Tomcat的类加载器了解么,回答不了解只了解Java的类加载器。
5 自定义类加载器怎么实现,其中哪个方法走双亲委派模型,哪个不走,不走的话怎么加载类(实现findclass方法,一般用defineclass加载外部类),如何才能不走双亲委派。(重写loadclass方法)
6 布隆过滤器了解么,讲了ip地址过滤的布隆过滤器实现。
7 听说你项目用过docker,讲一下docker的实现原理,说了虚拟机一般要对内核进行虚拟化,docker则用cgroup和namespace分别进行硬件和命名空间的隔离。
8 项目中遇到的最大挑战。
9 项目中学到最多的东西
10 有什么想问
蚂蚁财富事业部
一面:
1 亿级ip地址过滤
2 排序算法和适用场景
3 数据库的事务有什么用
4 数据库的悲观锁和乐观锁
5 数据的索引有什么用,怎么实现
6 联合索引的匹配原则
7 数据库万级变成亿级,怎么处理。分库分表,分片规则hash和取余数。使用mycat中间件实现。
8 redis这种nosql和mysql有什么区别,讲了一遍redis
9 Spring了解不,用到了哪些设计模式,说了四个,单例,工厂,代理,观察者,模板其实也算。
10 web请求的过程,讲了浏览器到http服务器的过程,再讲了mvc的请求处理过程。
11 你的职业规划
12 没了。
二面:
没有二面,好像说是跳过了一轮,直接技术主管面。
三面:
1 项目中的多线程,为什么用chm,还有什么可以避免并发问题。
2 平时在看什么,写什么博客,我说分布式,关注什么内容,大后端,Hadoop生态。
3 dubbo了解么
4 dubbo的基本架构,几个组件说一下
5 服务生产者和消费者怎么进行rpc调用
6 怎么进行服务注册发现 zk实现具体说说
7 dubbo的负载均衡怎么做,讲一下具体代码实现。
8 dubbo的服务容错怎么做,怎么知道服务器宕机了 zk的心跳机制维持服务器连接
9 好了我要问的差不多啦。
交叉面:
隔壁部门的技术主管,问了一道算法题。。就没问别的了。。我也是很醉。。。
题目是链表的排序,扯了4、5种方案,转成数组,直接排序,拆分再排序,顺序连接等等。。然后我表示不能再优化了。他就说没别的问题了。。。有点吃惊。
HR面:
1 兴趣爱好
2 三年到五年的职业规划
3 意向公司和城市
4 实习经历和收获
5 实习中最大的困难
6 为什么换公司,为什么拒绝菜鸟实习offer
7 你的缺点和优点
8 你觉得你比其他人优秀的地方说三个
9 为什么想来我们部门
10 巴拉巴拉
京东&美团研发面经
本文首发于微信公众号:程序员江湖
京东Java工程师
美团点评 后台开发工程师
1
京东提前批Java开发
电话面试
本来想等面完再发个面经,等了半个月了没等到。
一面:
0 自我介绍,讲一下项目中的多线程实现
1 Java的线程池的参数,拒绝策略,阻塞队列等实现和使用
2 fixethreadpool使用的是什么阻塞队列,如果使用arrayblockingqueue或者linkedblockingqueue会有什么问题。
3 ArrayList和linkedlist有什么区别,扩容呢
4 hashmap,hashtable,concurrenthashmap1.7和1.8选一个说一下。
5 jdk1.8针对hashmap使用红黑树优化目的是什么,红黑树的结构说一下。
红黑树的特性:
(1)每个节点或者是黑色,或者是红色。
(2)根节点是黑色。
(3)每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!]
(4)如果一个节点是红色的,则它的子节点必须是黑色的。
(5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。
6 JVM了解么,说一下内存结构,堆区的分代,垃圾回收以及所用算法。
7 为什么要划分年轻代和老年代,方法区是否会垃圾回收,还问了gc时要扫描哪些位置,说了gc root,他问具体呢,虚拟机栈的局部变量,然后说其他忘了。
在Java虚拟机中判断一个对象是否可以被回收,有一种做法叫可达性分析算法,也就是从GC Root到各个对象,如果GC Root到某个对象还有可达的引用链,那么这个对象就还不能被回收,否则就等着被收割吧。
这里既然提到了GC Root,那么哪类对象可以作为GC Root呢,这是一个在面试中经常被问到的问题。
《深入理解Java虚拟机》一书中是这么说的,一下几种对象可以作为GC Root:
虚拟机栈中的引用对象
方法区中类静态属性引用的对象
方法区中常量引用对象
本地方法栈中JNI引用对象
8 MySQL了解么,说一下建立索引要考量的点,说了索引筛选率,过滤使用的字段,以及explain查看是否使用了索引等。
1、表的主键、外键必须有索引;
2、数据量超过300的表应该有索引;
3、经常与其他表进行连接的表,在连接字段上应该建立索引;
4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;
5、索引应该建在选择性高的字段上;
6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;
7、频繁进行数据操作的表,不要建立太多的索引;
9 MySQL的隔离级别有哪些,默认级别是什么,他说是可重复读。
10 为什么select方法默认可以不加锁呢,明明可能会有并发冲突,我说根据隔离级别判断是否加锁,他说可重复读级别下select是不加锁的,为什么。
我说应该是用了乐观锁,也就是MVCC多版本并发控制,适用于读多写少,所以不加锁。
11 Redis提供有哪些数据类型
二面:
1 讲一下两个项目,分别做了什么,觉得跟自己做的项目有什么不同,如何看待这种不同,应该如何改进。
2 平时怎么学习,你的博客一般写了什么,觉得和高质量博客的差距在哪里。
我说我原创的都是比较基础的,进阶一点的博客主要是整理别人的文章。
3 Java虚拟机了解么,讲一下内存分区和gc,如何排查堆内存的问题,说使用jmap转储dump文件分析或者使用jstat等工具检测gc。
4 Java的线程池了解么,看过它的源代码么,怎么修改源码可以实现线程状态的监控呢。
visualvm工具
5 web框架了解什么,讲讲SpringMVC的启动过程,讲了mvc上下文以及dispatcher初始化过程和请求流程。
6 设计模式了解么,单例,工厂,分别出现在什么场景。
Spring,servlet,Spring的工厂方法
7 MySQL的select1和select *有什么区别,为什么加索引访问比不加索引要快。
8 负载均衡的几种算法,缓存的几种淘汰策略。
9 计算机网络了解么,http的header有哪些字段,是否包含ip地址。
10 有什么想问,能先来实习么,不能。
我说了不能先实习,然后就没有然后了,emmm,等了2周没有动静,估计凉凉。
美团一面
后台开发工程师
电话面试
1 实习经历
2 object类有哪些方法,hashcode,equals,clone,notify,wait。问我hashcode用在哪,说了hashmap
3 hashmap的结构,1.7和1.8有哪些区别,除了红黑树优化以外还有哪些改进,说了扩容时头插法改尾插法。
4 开始问我头插法和尾插法的区别,头插法在多线程时会出现什么问题,我说的是扩容时的死链,后来引导我说了并发插入的数据丢失问题。
5 concurrenthashmap的实现原理,1.7和1.8有什么区别,分段锁,synchronized和cas操作。
6 cas操作是怎么实现的,为什么是原子性的。wait和notify方法用在哪里,wait和sleep的区别,notify后面的代码会不会运行。
7 synchronized和lock的区别在哪里,使用方式上有什么区别。lock的trylock方法做了什么,我说了cas操作和加入阻塞队列,以及公平锁和非公平锁的区别。
8 你的项目用到countdownlatch,为什么要用,有什么问题,如何监控这个问题。
9 线程池用过哪些,线程池有哪些参数,然后问我几个常用线程池的用法和实际场景问题。
10 cas操作是哪个包里的,volatile变量用过么,有什么作用,原理是什么。i++是不是原子操作,为什么。
11 ArrayList和linkedlist有什么区别,如何遍历,使用for循环遍历linkedlist为什么不行,linkedlist能使用索引访问么,使用迭代器呢。
这里我打错了。linkedlist也可以使用for循环遍历。因为jdk提供了api。
12 JVM内存模型介绍一下,堆区怎么分代,分代垃圾回收算法说一下,老年代使用标记清除有什么问题。
13 说几个垃圾回收器,cms回收器有哪几个过程,停顿几次,会不会产生内存碎片。老年代产生内存碎片会有什么问题。问我有没有做过JVM优化。
14 jvm场景问题, 标记清除多次后老年代产生内存碎片,引起full gc,接下来可能发生什么问题。我说分配大对象可能引起full gc。
15 哪些情况会触发full gc,full gc是否包括young gc和major gc,如果只包括这两个,为什么要特地做full gc,我回答的是full gc还会回收方法区和堆外内存。
16 Java中有哪些引用,分别有什么用。
17 Spring的ioc和aop说一下。
aop记录日志,什么方法需要记录日志呢,增删改查都要么,我说前三个要把。他说那么如果有多级调用的rpc查找操作是不是也要记录日志,我说那是的。
18 分布式用过哪些技术,我说自己跑过一些demo,问我zookeeper有什么用,然后问我dubbo里的zookeeper是做什么的,我说服务注册中心。
19 服务注册中心实现什么功能,消费者的本地缓存如果失效了怎么办,我刚开始说多次失败重新拉取,他说这样不行吧,我就说让生产者和注册中心维持心跳,失效时删除该节点并且更新消费者缓存即可。
20 MySQL用的挺多,问你一下,innodb的b+树索引,主键索引,聚簇索引有什么区别。
21 MySQL里有哪些锁,行锁表锁,乐观锁呢,我说了版本号和MVVC,开始问我MVVC。
22 事务的实际场景问题,两个事务,一个查一个新增,问能否查到新增的,我问他隔离级别,他说RR。MySQL的RR避免幻读,所以读不到新增数据。
23 MySQL的死锁怎么产生的,举了两个例子。
24 三个事务,两个加读锁,另一事务尝试删除,应该是不行的。
25 两个事务,一个写提交,另一个能不能读到,可以读到。
26 大概就是这些了。
美团貌似凉凉,这次确实答得不是很好。
今日头条研发面经
本文首发于微信公众号:程序员江湖
今日头条上海
后台开发工程师
今日头条
后端研发工程师
找牛客大佬要了白金码,跳过死亡笔试,直接视频面,从3点开始,断断续续到晚上8点结束。
每个面试官给我的感觉都是怎么这么高冷啊。
1一面
一面:
1 写一个题,找一个无序数组的中位数
2 写了个快排,然后让我找到无序数组第k大的一个数,我说先排序再找,实际上可以用快排的partition函数。
3 快排的时间复杂度,最坏情况呢,最好情况呢,堆排序的时间复杂度呢,建堆的复杂度是多少,nlgn。
4 操作系统了解么,Linux和windows
5 说说Linux的磁盘管理,一脸懵逼
6 Linux有哪些进程通信方式,五大件
7 Linux的共享内存如何实现,大概说了一下。
8 共享内存实现的具体步骤,我说没用过
9 socket网络编程,说一下TCP的三次握手和四次挥手,中间网络不好,面试官都没听清楚,很尴尬
10 跳过网络,问了项目的一些东西
11 问我如何把docker讲的很清楚,我从物理机,虚拟机到容器具体实现稍微说了下。
12 问我cgroup在linux的具体实现,不会。
13 多线程用过哪些,chm和countdownlatch在实习用过
14 不得不吐槽下今天牛客的视频网速,不知道啥原因卡的一比,明明下载网速很正常啊,牛客视频每秒才20k。。疯狂掉线搞得很蛋疼。
二面:
1 自我介绍
2 Java的集合类哪些是线程安全
3 分别说说这些集合类,hashmap怎么实现的,扯了很多
4 MySQL索引的实现,innodb的索引,b+树索引是怎么实现的,为什么用b+树做索引节点,一个节点存了多少数据,怎么规定大小,与磁盘页对应。
5 MySQL的事务隔离级别,分别解决什么问题。
6 Redis了解么,如果Redis有1亿个key,使用keys命令是否会影响线上服务,我说会,因为是单线程模型,可以部署多个节点。
7 问我知不知道有一条命令可以实现上面这个功能。不知道
8 Redis的持久化方式,aod和rdb,具体怎么实现,追加日志和备份文件,底层实现原理的话知道么,不清楚。
9 Redis的list是怎么实现的,我说用ziplist+quicklist实现的,ziplist压缩空间,quicklist实现链表。
10 sortedset怎么实现的,使用dict+skiplist实现的,问我skiplist的数据结构,大概说了下是个实现简单的快速查询结构。
11 了解什么消息队列,rmq和kafka,没细问
12 写题时间到。第一题:写一个层序遍历。
13 第二题:写一个插入树节点到一颗排序树的插入方法,使用递归方式找到插入位置即可。
14 第三题:一个有向图用邻接矩阵表示,并且是有权图,现在问怎么判断图中有没有环。
15 我说直接dfs走到原点即为有环,刚开始写的时候我又问了一嘴是不是只要找到一个就行,面试官说是的,然后我说这样应该用bfs,有一次访问到原节点就是有环了。
16面试官问我不用递归能不能做这个题,其实我都还没开始写。然后我就说没有思路,他提示我拓扑图。我没明白拓扑图能带来什么好处。现在一想,好像当访问过程中找不到下一个节点时就说明有环。做一个访问标记应该就可以。
17 第四题:一个二叉树,找到二叉树中最长的一条路径。
我先用求树高的方式求出了根节点的左右子树高度,加起来便是。
18 然后面试官提示需要考虑某个子树深度特别大的情况,于是我用遍历的方式刷新最大值,用上面那个方法遍历完整个树即可。
19 面试官说复杂度比较高,但是由于时间问题就说结束了。
三面:
三面的面试官真的高冷啊,不苟言笑就算了,我问他问他他都不爱搭理的,搞得我内心慌得一比,感觉凉凉。
1 介绍一下项目
2 你谈到的并发技术,chm和countdownlatch怎么使用的
3 为什么要这么处理,使用线程池是不是也可以。我说也可以
4 操作系统的进程通信方式,僵尸进程和孤儿进程是什么,如何避免僵尸进程,我说让父进程显示通知,那父进程怎么知道子进程结束了,答不会。
5 计算机网络TCP和UDP有什么区别,为什么迅雷下载是基于UDP的,我说FTP是基于TCP,而迅雷是p2p不需要TCP那么可靠的传输保证。
6 他说不对,我说是不是因为要建立连接,开销比较大,他说不对
7 我说p2p的发送节点很多,所以不是那么需要各种传输保证,他说不对。
8 我说TCP会自动分包而TCP可以自己定义数据长度。。他还是说不对。
最后他说算了。我们问下一个吧。
9 操作系统的死锁必要条件,如何避免死锁。
10 写一个LRU的缓存,需要完成超时淘汰和LRU淘汰。
我说用lhm行不行,他说用linkedlist和hashmap可以。
于是我就写了put和get函数,进行了队头队尾操作。
他说get复杂度会不会太高,我瞎掰了半天没找到办法,他说那就这样吧,今天面试到这。
11 妈蛋,过期淘汰的处理我还没写呢,你就说结束了,感觉凉了啊,我说我要不要把剩下逻辑下完,他说不用,心凉了一大截~
12 然后HR小姐姐让我等结果了。溜了溜了