从3月下旬开始陆陆续续投一些大厂,到现在4月末了,依旧0offer,说实话确实是有点emo的。
情况如下:
投了无响应(或者待筛选):
B站
滴滴(内推,基本无hc)
华为
网易
网易雷火
深信服
简历挂的
快手
网易游戏、网易互联
拼多多
笔试完成(有刚笔试的,也有笔试很久没消息估计挂的)
京东
百度
腾讯
一面挂
美团
技术终面/三面挂
蚂蚁
字节
以下是我面试后的一些复盘笔记,因为每次面试完我都会有复盘,然后把我回答不好的地方去重新整理,并记录到我的知识脑图中。
自我介绍
Java内存模型(自由发挥)
高速缓存在哪(介绍硬件时被打断,追问了高速缓存)
为什么要提出CAS,如何实现变更高速缓存时的同步(其实就是问高速缓存的具体步骤)
CAS具体步骤
CAS为什么要compare的过程
CAS的ABA问题(自己延伸的)
有哪几种线程池类型?
ThreadPoolExcutor参数
有界队列和无界队列的场景
hashmap 1.7和1.8的区别
hashmap导致死循环的bug在什么场景下产生?
mysql insert buffer(change buffer)有什么用?
double write(双写)是干什么的?
mysql为什么要写日志,为什么不直接写进数据? 你不觉得保存数据那一刻数据库宕机了,也没写到硬盘里啊。
四个commit知道吗?(七绕八绕原来是问事务隔离级别)
事务隔离级别原理(MVCC)
mysql里面的索引(说了一点紧接着又提问下一个问题)
B+树和B树有什么区别?
mysql中联合索引是怎么搜索的?
为什么我查中间字段联合索引就没用了
场景题——真实场景里的一个舆情分析问题,他们自己也在做(100w+文本 5-100字 每小时产生20W+数据 有相似度(可以使用标签,地点,时间(24小时)) 要求对数据进行去重)
算法题——数组里寻找“叠词”
优化一下(直接改题目…)
围绕项目开问,问了好多,但是我的项目主要是物联网方向的,所以面试官貌似不太感兴趣(再加上我也没说好)
hr问了我经历相关,包括我社团会长和实验室负责人的事情
PS:3天后官网显示流程结束
你是如何理解Java的
Java的运行过程
聊聊项目
一道算法
聊聊方向
PS:面试完我要了面试官微信,因为方向不同,后来想思考再三,跟面试官说放弃接下来的面试。
岛屿涨潮(二维数组,模拟),很简单,不过不太习惯网页的调试,导致过了半小时没a出来,后来再去看的时候发现小细节问题,改了a过了
一道简单的dp(类似于加油站问题) 这个直接a
一道模拟,网球桶装网球 主要发现实质规律就好做了,十分钟a
一道比较难的dp(集卡) 位操作状压+回溯+备忘录,四十分钟a出来了
ak!
完了之后面试官评价了句技术栈挺全的
hashmap是如何实现?(讲了hash的大概原理,细节部分讲了插入过程和扩容过程)
链表是头插还是尾插?(头插,提了由于完全头插会导致的循环链表的bug)
扩容的过程细节?(重述一下扩容的过程,补充了一些细节)
当触发扩容时,是一次把扩容操作完成再返回,还是有其他的操作?(没了解,不过讲了我自己的理解,我会怎么做。稍微进行了优缺点分析,讲了我会新建一个线程去做这个扩容问题。之后又问了如果新建一个线程去做扩容,这个过程的读写操作如何处理,我当时想根据concurrentHashmap扩容机制去说的,但是面试官很快就说没事,没有了解过就不继续深入探讨了)
进程线程是什么?
进程间通信方式?(说了五种,忘了信号量,一时间想不起来了)
六个通信方式里面哪个效率最高?(不了解,没去比较过)
逻辑地址和虚拟地址怎么理解?(讲的有点乱,因为其区别我也忘了)
逻辑地址的好处是什么?(灵活分配,可能答案不是这个,这个随便讲的)
不加逻辑地址有什么不灵活之处吗?(我就拿虚拟内存来举例逻辑地址的灵活性,面试官帮我总结了这是内存利用效率上的)
还有吗?(我:便于内存回收吗?面试官: 怎么讲?讲了内存分配,扯到逻辑地址可以实现物理地址离散分配)
IO多路复用了解过吗?什么是IO多路复用?(讲了概念,select、poll、epoll)
select、epoll分别在什么场景下使用?(讲了两者的具体实现细节(select的轮询,epoll的优化——功能分离、就绪队列,编码层面上的理解,讲的稍微有点乱,属于随机应变的),select适用于简单、socket会变的情景,epoll使用于效率要求高的,订阅socket不变的场景)
我看你项目里用到了HTTPS,说一下HTTP和HTTPS的区别
加密算法有几大类(没回答出来,但其实我是知道的,后来面试官提示了对称加密和非对称加密)
怎么理解对称加密和非对称加密?(介绍了两者的细节)
HTTPS秘钥的过程了解吗?(从设计角度讲了这个过程,包括数字证书、公钥、私钥)
redis数据结构有哪几种?(讲了四种,忘了一种,开始扯高级结构补了,不过后面想起来了补上了list)
redis里的hash扩容了解吗?(不了解)
redis过期策略(一开始答偏了,答到了内存淘汰算法,后来面试官换了种问法,也答了惰性删除和定期删除)
redis持久化机制,说一下你的理解(RDB、AOF、混合方式)
aof刷盘机制有哪几种?(说了三种和优缺点)
事务特点(答了ACID,结果脑子瓦特了,只知道A对应原子性,一致性)
事务隔离级别
mysql是哪个级别?
可重复读会有什么问题?(说了幻读,结合网上对于幻读的两个版本,说了自己的理解,以及如何解决这个问题)
旋转数组(花了15分钟,一开始说了思路,写的时候有些bug,面试官稍微提示了下,磕磕绊绊写出来了)
反问环节:
面试官您对我这场面试有什么建议吗?(真的只是想问建议,因为蚂蚁终面挂了,美团一面自我感觉良好也挂了,我都不知道自己哪里没做好)面试官说这个不方便回答,我给你建议相当于直接告诉你结果了(意思是我挂了?),面试结果会在之后通过hr告诉你
后端学习有什么建议吗?(因为我实际方向是全栈,前端后端都学,后端学的更多一点)大概意思是要选定细方向,然后有针对性去深入学习,不追求全都会,但要学深。
还有别的想问的吗?没了
PS:面试官还是很温柔的,点个赞,不过那句“我给你建议相当于直接告诉你结果”弄得我好慌啊。
如果通过可以实习多久?
问了下学校的课程
说这面是一面的交叉,45min左右
本来打算自我介绍(他说不用了,觉得学生应该没啥可介绍的…)
看你一面问了hashmap,另外有种容器TreeMap有用过吗(没用过,但我知道它底层使用红黑树实现的)
为什么有了hashmap还会有TreeMap这样的容器呢?(沉思了一会说不了解)
红黑树查找的时间复杂度是多少?(logn)
除了红黑树还有哪些数据结构查找效率是logn?(跳表、avl树、B/B+树,后面不小心回答了最大堆和最小堆,面试官反问了最大堆和最小堆可以查找吗?我突然反应过来说不可以)
你觉得TreeMap底层为什么用红黑树而不用其他数据结构呢?(我TreeMap都没怎么了解过我怎么知道…扯了一通效率问题(红黑变色减少左旋右旋,23节点转化))
为什么不用跳表呢?(空间比较耗费,多级目录)
但是红黑树还有很多不存储数据的黑节点,而且还不少,这样不同样浪费空间吗?(黑节点不能存储数据吗?我突然不自信了…不过面试官貌似指的是空链接/叶子节点,然后说不了解)
Java里面的泛型有使用过吗?原理?(一开始没反应过来,后来说了——编译器层面进行类型替换)
对于Linux熟悉吗?(不是特别熟悉,用过是用过…(其实用的不多,基本是部署项目的时候用的,还借用了各种图形化工具))
linux上一个程序运行起来是一个进程对吧?(对)
32位地址空间,高地址到地址放的什么内容?(只回答了内核空间和用户空间,具体也不了解…)
用户空间又分为哪些部分?(大无语,不了解…)
有用过redis对吧,看你项目用redis做了缓存?(对)
redis里内存淘汰是LRU对吧?(还可以是其他机制,一般是LRU)
假如让你去实现LRU cache的话,你会怎么实现?(链表基本实现,扯了下MySQL的LRU策略优化——冷热数据分离)
LRU cache不适用于什么场景?(想了一会儿,因为没碰到具体啥业务场景,所以开始一堆假设,反推,自言自语。然后说——数据量很大,一个周期取数据,取完数据就马上被淘汰了)
如何实现LFU?(我其实也不太记得了,只记得要存储频率这种关系,所以说的比较模糊,因为大致也提到了频率、map啥的,而且LFU有好几种实现方案,所以也就混过去了)
那这样的话如何找到频率最小的删除掉呢?(开始胡言乱语,又扯到用红黑树这种结构去实现,当然这是可以的)
这样做的查找插入时间复杂度是多少?(继续开始胡言乱语,又开始假设用hashmap去实现,O(1),后来提醒是TreeMap,所以又改成O(logn))
那插入时间复杂度是多少?(logn)
有没有时间复杂度更低方式?(沉默了好久,不了解(之前不是都说了HashMap吗,我都佩服我自己了))
PS:回顾这块真的是不忍直视,因为一开始不太明确实现,然后面试官揪着不放,问了一堆问题把我问懵了…
对mysql比较熟悉对吧?有实际使用过吗?用的是InnoDB对吧?(啊对对对)
InnoDB里聚簇索引和普通索引区别是什么?(扯了B+树模型本身以及两个索引的区别)
为什么普通索引里存储的是主键的值,为什么不是像文件偏移量这种数据呢?(因为地址在变)
索引为什么用B+树实现呢?(围绕减少磁盘IO开扯)
除了提升磁盘效率以外还有什么原因呢?(围绕范围查询开扯)
除了这两点以外还有什么原因吗?有一个非常基础的原因(有利于顺序写吗,因为数据是有序的…)
mysql推荐自增主键的原因,我能不能用字符串和随机数取做一个主键?(扯到B+树结构,追加写,防止页分裂…)
那使用自增主键也有一些坏处,有哪些?(分布式场景中自增主键的比较难获取…)
假设我们是单机数据库,不考虑分布式的情况,自增主键的缺点是什么?(想了一会,不了解)
有接触类似于像XXDB(听都没听过,不知道他在说什么)的数据库吗?(没接触过,我接触过其他数据库就比如说TDengine这种时序数据库,因为项目涉及物联网,需要存储时序数据)
有接触过分布式系统RAFT协议吗?(没有)
代码题:
寻找峰值 LeetCode162(这题做过,等面试官解释完题目,我就向面试官说了两种思路,一种暴力解法,双指针;一种二分爬坡法…面试官也追问了——这样确保能找到一个吗?这个m是否一定存在的?也回答了面试官(纯属临场发挥),5分钟看题+说思路,4分钟写代码+调试)
逻辑题:
两张桌子,一张3个,一张4个,A、B玩游戏,轮流拿,每次只能拿1-2个,不能不拿,也不能一次拿两张桌子,这个游戏如果先手的话有什么必胜的策略吗?
跟面试官演示推理过程和思路,不过一开始理解有问题,面试官也纠正了我的理解,最终也回答了一种方案。
那有没有初始的不是3、4,而是4、5?
开始自言自语推导,当然这个过程也和面试官在交流…
最后面试官说回到3、4这个问题,刚刚说到3、4变0、3,有没有别的思路?(后面问了别的思路是不经过0、3)
经过自言自语也回答了1、2这种情况,然后和面试官聊这种情况,相当于我当A,他当B
最终和面试官扯了15min
反问:
您之前说这面是交叉面,交叉面是什么意思,是我一面面的太差了吗?(纯属好奇)
原本想问学习建议,结果问道一半突然觉得这个问题应该跟方向有很大关系就不问了。
Tik Tok直播主要是干什么的?
您作为一个专业的IT从业者,平时遇到问题是怎么解决的?
简单问了下项目,设备如何和系统通信,为什么要设置一层消息服务器
算法题:
单向链表折半插入,不能使用数据结构(说了下思路(递归),调bug花了比较长的时间,中间面试官催我能不能快点,花了25min终于a出来了)
不用递归怎么做(面试官:既然你觉得简单,你看能不能用非递归方式实现(我是真的作死…),想了5min想出了思路和面试官说了,然后开始写代码,花了15min a出来了)
PS:一道算法题做了44min,真的佩服我自己,手撕代码遇到bug是真滴尴尬…
进程间通信使用共享内存,如何保证共享内存里数据的一致性?(mutex,使用文件锁)
什么是文件锁?(大概说了一下原理,其实也是比较模棱两可的答案)
mysql InnoDB引擎下如果不使用自增主键而是采用随机数的方式会不会有什么性能问题?(根据B+树模型分析了其造成的效率问题)
具体能解释一下自平衡是怎么个自平衡吗?(讲了下插入的过程,讲到B+树的关键字的个数范围时面试官就打断我说我知道了,不用讲下去了)
平时会看什么样的技术书(Tinking in Java)
面试官:我这边大概想问的问题就这么多,我们这轮面试先到这,后续hr会保持跟你联系(这是啥意思?过了还是没过?)
第二天晚上收到感谢信,说实话还是有点小emo的。
总体而言给我面试机会的大厂不多,给了面试机会的,大多也是到了终面把我挂了。
说实话,这一个月下来进步也是蛮大的,通过面试也知道了自己的不足,面后有意识的去整理相关知识。不过很遗憾的是,目前依旧0offer。
思考原因,一个原因是我自身确实没有那种硬件条件,没有那种亮点(双非、无acm牌子、无实习经历),容易被排序挂;另外一个原因就是我的基础确实没有好到足以忽视自身硬件条件的程度。当然还有其他因素,比如面试官貌似对我那个物联网项目并不感兴趣。
至于接下来的选择,有人建议我考研,但其实我觉得考研并不是逃避的万能钥匙,而考研失败的代价我无法接受,考个水硕的意义也不大。
暑期实习既然进不了大厂,那就海投一波中厂。这个过程中开始继续刷算法以及深入系统的学习专业知识(比如Linux,最近看面经整理知识,但是我无法将这些知识的来龙去脉融会贯通的组织起来),提升自己实力(最近确实有点摆了,学习效率奇低),而第一步就是删了我手机里的所有游戏。
说实话自己还是有点赌气的味道,不过这一次我还是选择和大一一样赌气一把。
只要我学到笔试面试把算法题都a出来、面试官问的问题都答出来的程度,我就不信他还能挂我!
须知少时凌云志,曾许人间第一流。