从12.20日开始到1.10截止,一共面试了六家公司,在此记录一下所有的面经
背景:本硕mis,之前在一家小厂做大数据后端开发,编程语言比较熟悉Java,因此投的大多数也是Java后端开发。
基础部分:
arraylist和linkedlist的区别?他们在插入一个数的效率上有什么区别?
介绍一下hashmap
concurrenthashmap和加了sync关键字的普通map有啥区别
mysql的事务了解吗(忘了。。。)
线程与进程的区别
线程有什么状态
jvm介绍一下(我说了自己熟悉的垃圾回收算法)
tcp/ip三次握手四次挥手
http协议了解吗?(没有。。。)
项目:
FTP协议中文乱码,协议内部是为什么(不知道,我就直接调的包,然后中文乱码加了一个通信协议和UTF-8的参数)
线程池了解吗?当程序用close()方法后,线程池里面的连接会关闭吗?
比较熟悉的项目介绍:
最熟悉的是PGSQL和ES的数据同步,用了一个git上的开源项目作为中间键。
首先是介绍了一下项目,然后是ES的底层写入原理(项目用到自己了解过,介绍了一下)
最后问我简历写了对并发有了解,就问了我高并发,我说其实我不咋会hhh
基础知识:
volatile关键字解释一下(提到了原子性和可见性)
原子性解释一下(我就不应该提)
jvm了解吗?(我还没了解过具体的分区,就讲了自己比价熟悉的jvm垃圾回收算法)
spring的loC解释一下
项目:
仍然是说了自己的PGSQL和ES的数据同步的功能开发,讲了ES的底层写入原理
然后面试官问:
那ES是怎么写到磁盘上的(讲了一下restClient的bulk操作)
存到磁盘上面之后,怎么存的(倒排索引)
倒排索引具体怎么实现的了解吗(我猜了一下B+树但是我没说。。。可惜)
算法题:(算法我才刷了两周,算是最弱的了)
一只青蛙每次可以走3到5格,它的这条路上每一个格子都有一个不小于零的整数耗费量,这个青蛙如何跳,能得到最小的耗费。
我做过lc上简单版的跳1或2格的,就说了下用dp,但是最后写完了感觉也不对,面试官就说算了
上来就是一个sql题,表结构是:
uuid event time
1 start t1
2 start t2
1 audit t3
1 publish t4
3 start t5
大概就是这么一个表结构
1.求三个event(start audit publish)的人数(漏斗)
我直接就用了in方法,然后面试官反问我还有没有别的,我说exists和自连接
面试官问还有没有别的,提醒之后说可以用case when把event转成三列然后就可以算了
2.求次日留存,然后扩展到求N日留存
然后因为看我会java问了点java
ArrayList和HashMap有什么区别
算法题:两个有序队列合成一个有序队列
其他:
对大数据的理解是什么?
为什么做大数据?
二面上来面试官都没让自己介绍,直接上算法题
题目:将一个二维数组Z字输出
做出来了然后面试官说没啥问题,然后来了道SQL
表结构和一面的差不多,就是把event三个换了名字(我这里直接复制下来了):
uuid event time
1 start t1
2 start t2
1 audit t3
1 publish t4
3 start t5
题目:求start -> audit和audit-> pubish两个过程所用时间的50和80分位数
题目不算很难,只不过我后面算百分比的时候一开始想用窗口函数算第一行到现在这一行的count然后再除以count(*)
面试官提醒我可以直接用rank(),我改了之后说基本没什么问题,不过可以用count(*)作为total乘以0.5和0.8来找,而不是用rank()/count(*)
两道算法题后自我介绍,开始挖项目
项目巨简单,就是做了个pg和ES的数据同步,中间件还是开源的,做了个队列持久化
我介绍完项目之后,直接问我:你这个数据有多大?TB?(不知道,我就做了个中间队列的持久化)
你刚刚说你会把没同步成功的log持久化,你有考虑过你的中间件在ES断开之后有什么操作吗?(就是把Log放到数据库中)
放到数据库后你怎么处理的呢?(用modify_time标识,要是同一条数据在后续的修改被同步到数据库中,那log表里面的其实就作废了)
那你这个属于状态量,你有考虑过过程量吗?(给我介绍了全量和增量的区别,在业务上状态量和过程量的区别)
你有考虑过数据量如果太大的话如何进行处理吗?(分布式?)
然后面试官说你这个项目问题很多,你自己做的时候多想想
然后问java基础
ArrayList和LinkedList的区别,效率上,底层上
JVM垃圾回收机制(这里因为之前面试没说出来,特意去背了,说完感觉自己说的挺不错的)
然后。。。面试官问:那这个垃圾回收调参你知道怎么调吗?就是这些算法在什么情况下用什么参数?
面试官说,你学习的时候记得要多多联系业务实际
最后问了下HDFS,spark,Hadoop有没有接触过?
最后问我为什么想搞大数据,以后职业发展准备咋样
上来先自我介绍
先问了专业MIS是干什么的,闲聊了有10分钟,然后才开始
手写单例模式(还没自学的)
请求一个网页的全部过程(计网知识,也没学过)
32位和64位系统的区别(操作系统,还是没学)
synchronized和volatile
JVM内存模型和垃圾回收机制
MySQL的B+树索引
HashMap线程安全问题
项目介绍
算法题:层序遍历二叉树
面试体验说实话有点差,不知道是不是自己太菜了,面试官一直让我自己说自己会什么,我提出来几个点也几乎不怎么问。就给我一种面试官是被硬拉来面试的。。。。
介绍了一下项目
让我自己说说用过什么集合(arraylist和hashmap)讲了一下hashmap的底层原理
问我除了再hash还有什么别的办法没有
问我了解数据库吗,然后让我自己介绍自己会什么,我提到了索引,事务,锁,innodb和myisam,都没问,问了一下索引,然后我说innodb和myisam底层不一样,也没回应。然后问我怎么优化sql语句,我说了一大堆但是反应也很平淡。
最后做了一个返回环形链表的入口的问题
总之就是感觉面试官面无表情,语气也很平淡,也不知道为什么,感觉凉得不行。
上来先聊了一下项目,然后从项目开始入手
项目直接问了数据量,在数据库宕机的时候的处理方法。(这里聊得很细节,但是项目我没参与这么深就不知道怎么回答了)
因为用到了PGSQL,所以开始聊数据库的问题
InnoDB和MyISAM的区别
前面两个引擎的B+树有什么区别
能讲一讲锁吗?(共享锁和排它锁),那可以聊一下意向锁吗?
然后是Java的问题
ArrayList和LinkedList的区别,效率和使用上
Java的八个基础数据类型
int的范围
float二级制怎么存的
最后是写归并排序一个单向链表(用Java写的,差不多写出来了面试官说时间差不多了就不用再写了)
面试官没有问spring、Mybatis、Redis、JVM一众热点问题
最后告诉我说非科班出身确实得多学学基础知识
关于锁了解多少,知道lock这个锁的底层原理吗
我提到了sync和volatile;CAS;无锁,偏向锁,轻量锁和重量锁,都解释了一遍
可惜面试官说其实他想问的是AQS,还非常好心的给我解释了一遍
spring的loc和AOP大概是什么样子的
concurrenthashmap和hashtable的区别
他们都是线程安全的,但是加锁的原理不同,hashtable是整个表加锁,concurrent是分段加锁
问了一下数据库的知识,我自己提到了innodb和myisam
面试官就问一个表id和name,在name上加了索引之后,生成的两棵树分别是什么样子的
算法题就是给一个树的节点,根据中序遍历规则,给出下一个节点的位置(树的节点包括了left,right,father的三个指针)
这个一二面比较随意,二面面试官说比较偏前端,所以就没问什么
快手和百度给了offer,但是快手那边要求年前就入职所以我没去,百度隔了10天才给我打电话说过了,所以就选百度了
有意思的是,我在2020年8月找实习一直在找数据开发,然后投到后端开发了,现在又转回数据开发了