先说说我与字节的那些事
4.29 字节春招截止倒数第二天,杭州Java商业变现部门暑假实习,隔天挂,春招结束(人生的第一份简历,嗯就开始即结束🤣
6.15 字节提前批开始的前一天,杭州飞书日常实习部门,隔天挂,实习结束(不是
6.19 收到字节笔试邀请,才知道原来求职有【捞】这个操作,果断参加,迎来人生的第一次笔试 => 0ac(实在不会用Java的输入输出。。。),后来第二波笔试ac2.x
6.29 收到了hr的电话通知面试通过开始约面试,于是长达半个月的三面开始与结束,最后三面挂了哈哈哈,一二三面面经在这 https://www.nowcoder.com/discuss/451758?source_id=profile_create&channel=1009
中间被北京鞭尸两次,都拒了,后又被深圳捞起来,hr小哥哥说可以考虑是一次新的机会,我就答应了
一个插曲:
我:我现在在厦门实习
hr:厦门美团吗?
我(连忙):小公司小公司小公司
最怕空气突然安静.jpg
没想到今晚直接面完两面,字节的效率和面试官的态度就我个人而言,五面的经历都很不错,会引导,也不会非常严肃,我第一次面试的那个面试官应该是最严肃的了🤣
然后我个人不喜欢录音,通常都是靠记忆来复盘的,这次直接两面我脑容量有点不够,我的脑子不太会响应缺页中断,主要是因为饿了,没吃晚饭,哭唧唧,所以会乱序+遗漏就不要在意了
可能是因为很缺人吧,两面都是 半小时基础 + 半小时算法,没有挖项目,有三面的话应该是会问项目了吧(发抖
2020/08/21 问题补充
一面的题
你刚刚说的是单例bean是吧,spring还有那些bean?
proptotype,request,session,global-session。然后说了原型bean就是每次都生成一个新的bean实例。
request bean和session bean有什么区别?
我就说了request是一次http请求就会创建一个,session也是,然后面试官说这不是一样吗,我也没了解过,于是这个问题过了。
一面 19:30 - 20:30
1. 自我介绍
2. 类的生命周期
(我在字节终于被问了Java基础,天啦噜)
加载 -> 验证(符合规范约束,不会对虚拟机有危害)-> 准备(类变量/静态变量赋零值,静态常量赋初始值)-> 解析(符号引用替换直接引用)-> 初始化(类变量赋初始值blablabla) -> 使用 -> 卸载
3. 符号引用和直接引用
果然给自己挖了坑,我说符号引用可以是任何形式的字面量,与内存布局无关,加载的时候拼接(这里有问题)起来能定位到目标对象;直接引用就相当于直接指向目标的指针,与内存布局有关。
面试官表示不理解,要我再讲一下符号引用,我之前看过公开课讲过符号引用转变为直接引用的过程,但是印象不深了,就说他是常量池里通过指令后有个什么指向什么的说乱了,最后坦白说我自己也有点乱就先过了。有大佬跟我讲一下这个吗?
4. 类加载机制?这么设计的好处?怎么实现打破?
昨天网易二面刚问过类加载模型,我就把双亲委派和哪几种类加载器都说了。
好处是一个安全(防止用户自定义的类覆盖基础类),一个防止类被重复加载。
打破我说的是线程上下文类加载器,就是引入线程上下文类加载器(通过 Thread 类的setContextClassLoader()方法设置类加载器),通过父类加载器去请求子类加载器来完成类的加载。不过我只记得是叫线程上下文类加载了,忘了是通过设置类加载器来打破,所以面试官就问我说这难道不是一种新的类加载器吗,我说不是,只是在加载的时候可以通过他来改变,面试官表示不解,我表示忘了。于是过🤣。
5. 你们都是使用的spring框架是吧,讲讲框架初始化的过程吧
我表示自己只看过bean加载和aop的源码(实际上事务管理也看了,但我忘得差不多了不敢挖坑),于是就说能不能讲bean加载的过程,表示ok。于是就把bean加载的整个主要的流程说了一通
解析beanname=》单例池找单例(三层缓存)=》单例bean的创建=》记录加载状态(放进map)=》实例化前置处理(BeanPostProcessor接口,顺便说了下aop的代理加强就是在这里判断实现的,有个aop的BeanPostProcessor)=》提前曝光(三个条件:单例 + allowEarlyReference + 正在加载中,都成立就提前曝光自己的ObjectFactory放到第三层缓存里)=》属性填充(讲了下循环依赖)=》移除加载状态(从map里去掉)
其实还有根据构造器构造的部分,我记不清了就没提,避免挖坑(
6. spring怎么选代理方式?
实现接口默认jdk动态代理,没有实现默认cglib,前者通过实现类,后者通过继承,也可以通过proxy-class-target来指定使用cglib。然后他好像想接着问的,不过还是说过了,可能是想挖深一点吧。
7. 数据库的隔离级别d
读未提交(脏读),读已提交(不可重复读),可重复读(幻读),串行化。
这里有点好玩,实际上幻读我一开始说的是【幻行】,然后他就问我【幻行】是什么,我一下子没反应过来,就说是一个事务内两次select多出了不存在的行,他说噢【幻读】啊,然后我才反应过来,说噢噢噢【幻读】是一种现象,【幻行】就是多出来的行hhh
8. 怎么做到可重复读?
我说可以通过mvcc来解决,以及mvcc在可重复读下可以优化幻读问题。请注意:RR级别下不能完美解决幻读问题哈,mvcc也不行,也别跟我说next-key算法,手动加锁那算是存储引擎自己主动干的事吗,不算!毕竟飞书一面被面试官质疑过,写过博客,可以参考 https://blog.csdn.net/weixin_42907817/article/details/107121470 不过写的不咋好哈,随手记录罢了。
然后就讲了mvcc的原理,讲了两个隐藏列,事务id和指向undo log的指针:事务A快照读后,事务B启动并提交了insert操作,这个时候这条记录的事务id指向事务B,事务A再执行快照读时不会把它纳入结果,因为事务B的id大于事务A的id,根据undo log回滚发现这条记录他本就不存在。但是如果此时事务A执行的操作比如说update覆盖到了这条insert的记录,那这条记录的事务id就会指向事务A,此时事务A再次执行快照读的时候就会发生幻读现象了。
================================= 手动分割线:下面9、11、12、13的回答是有问题的,题目本身我记得也不清楚了,就不说自己的回答了,当然了看客们知道的能不能留下正解 (拜托啦这对我真的很重要 ==================================
9. update操作不会判断事务指针吗?
说了不会,实际上这里我也有点疑惑,挖个坑好了,之前一个小伙伴跟我说是update是会执行当前都然后上写锁,我觉得有点不对劲,待解决。
10. undo log是用来做什么的?事务提交的时候会提交什么日志?
11. redo和bin的提交顺序呢?
12. undo log 和 redo log的区别?分别记录了什么?binlog呢?
undo log是存储引擎层的日志,是一种逻辑日志,记录的可以说是一个反逻辑的sql;binlog是数据库层次的日志,记录了对数据库增删改的sql;redo log也是存储引擎层的日志,但是是物理日志,然后记录了什么我一下子忘了就说了不知道,实际上应该是记录了对数据页的修改吗?
13. 数据库会把数据持久化到磁盘为什么还要redo log来做持久化?
这个其实是我前面的表述问题,redo log是做事务持久化的,是我没注意到。
14. 算法
力扣原题:82.删除排序链表中的重复元素II,我以为我做过的,实际上搜到的时候现显示没有提交记录(?
一开始想一次遍历来做,发现总是绕不开,就改用递归了,跟面试官先说了思路后写了主要逻辑,然后通过。
中间有两个小插曲,一个是一开始编译总是过不去显示非法字符,我以为是输入输出有问题,最后面试官提醒我说你用了中文的分号
还有一个是可能一开始hr没沟通好,我做题做到一般面试官突然下线然后二面面试官上来了,跟我说你是来应聘后端开发工程师的吧blablabla,我说是,然后我说我有个问题:我刚刚才面试到一半,还在做题呢🤣
15. 反问
万年不变的问您觉得这里的工作氛围如何?
面试官说突然问这么广啊,我觉得还好吧就互联网公司嘛,身边年轻人也挺多的,压力也挺大,每天有做不完的需求
二面 20:30 - 21:30
解释了下刚刚提前上线的情况,然后说我们重新认识一下🤣
二面真的记不清了,比较基础的题我也就不详细写了哈。
1. 自我介绍
2. 你们这个灭菌器的项目有多少人会使用的?
我说这还不清楚,还没上线。
然后问我说你们本科就有导师的嘛,有自己的实验室嘛?我说是,不过我们就是普通的工作室。(因为我有三个跟导师的项目(其实都是crud(小声bb
3. 不知道的情况下就使用了redis嘛?
因为!要!写进简历里的嘛!(内心os
因为灭菌器他有很多的一些固定的参数,是不会修改的,所以走了redis
4. 有考虑过使用其他的,比如使用配置文件来存储吗?
没有(也没太懂?
5. 缓存更新是怎么更新的呢?
先写库后删缓存,读的时候先读缓存没有就读库然后更新(这里我只是说了我项目里怎么做的,因为没有需要实现强一致性
6. redis的数据是存储在哪里的?内存,也可以持久化到磁盘。持久化方式?rdb快照,aof日志。
7. 知道redis的主从选举嘛?
我说我只知道主从的原理,就讲了主从复制的原理过程。旧版的sync和新版的psync,完整重同步和部分重同步。
8. 有使用过redis的过期时间吗?怎么实现的?
我说我简单使用过,然后我以为他是要我说实现的原理,就说了不知道,他就说如果让我实现我会怎么实现,我说会设置定时器,然后优化不出来就过了。
最后我才知道原来他问的其实就是删除策略,也就是惰性删除和定期删除,不是原理,可惜了。
9. 知道sql注入嘛?怎么解决的呢?
讲了讲字符串拼接的sql,举了用户登录的例子。然后说mybatis的preparestatement可以解决,也就是通过预编译语句。
10. 软件专业学过计网的吧,说说tcp和udp的区别?哪一层的协议?我们现在面试用的哪个?http用的哪个?
11. tcp提到了流量控制和拥塞控制,说说区别?
流量控制是一对一,防止发送方发的太快接收方来不及接受;拥塞控制是全局,防止过多数据注入网络导致网络拥塞。
12. 滑动窗口知道吧,讲讲滑动窗口?拥塞控制的四个算法知道吧,讲讲四个算法?
(说到后面自己有点口胡哈哈哈哈,面试官说没关系他知道我知道了。
13. 输入url回车经历了哪些过程?
简单记录一下,浏览器解析域名=》dns服务器找ip地址(递归or迭代)=》传输层tcp三次握手建立请求=》发送http报文=》接收报文给浏览器渲染
14. 知道浏览器怎么渲染的嘛?
不知道呀
15. 计网过了,问问os吧,知道堆栈嘛?
我说我可以从Java的角度来讲吗,就说了堆线程共享,栈线程私有(这和Java角度有什么关系啊喂)。然后问我进程之间共享嘛?我说不共享来着。
16.知道虚拟内存和常驻内存嘛?
我说我知道虚拟内存,就举了个例子来说明虚拟内存,提了下调页和缺页中断。
17. 调页算法有哪些呢?
lru,lfu,fifo,理想化的opt。
18. os过了,我看你经历挺丰富的,没参加过算法竞赛吗?
无,我今年才开始学的算法。面试官说数据结构与算法不是应该大二就学了嘛?我说我们大二只学了数据结构,算法是后面的选修课😂
19. 那你知道常用的算法吗?
然后挨个问我知道链表吗,知道双向链表吗,知道树吗(我内心os:这不是数据结构嘛😂
然后问我知道完全二叉树吗,我说知道,但是一下子不知道怎么描述,语废啊我,然后他就在共享屏幕给我手打让我判断了🤣🤣🤣
然后问我知道图吗?我说简单用过,果不其然他就带着【dijkstra】来了,实话实说真的忘了😂
然后问我知道大顶堆吗?我说知道,他就给我打了一个大顶堆的图,问我弹出最大值后会怎么做,毕竟是手写过大顶堆的人,我凭着记忆说把最小值和最大值互换,最大值取null,堆顶的最小值下沉。然后他问我如果不是完全二叉树怎么办,没理解,重新画了个情况,就是把同层的两个节点互换了下位置,我说我记得他下沉的时候会跟同层的兄弟节点做判断,具体忘了(就这你也敢说自己手写过大顶堆?
20. 那我们来写道题吧?
说出来你可能不信,是力扣第一题😂
力扣1.两数之和 https://leetcode-cn.com/problems/two-sum/ 不过面试官只要求我返回存在情况的个数。
其实一开始没想法的,说了可以通过set存储然后遍历,然后他说可以不用额外空间嘛,想了会儿我说可以预排序然后用双指针。他说对,然后写了核心代码。
提升,如果是三数之和呢?也有原题 力扣15.三数之和 https://leetcode-cn.com/problems/3sum/ 不过面试官的题是无重复数组
我说加个循环,最外层指针做for循环遍历,每层还是双指针,问了时间复杂度,我说nlogn。
提升,如果有重复数组呢?
我纸上画了下说让两个指针移动的时候跳过重复的就好了,最后大概是时间还充裕就让我把这版代码也写了。
中间有点空指针的bug,也改出来了😂
提升,如果是k数之和呢?不用写,直接说思路就好,
没啥思路,面试官就提示我了,问我说一个数组的全排列会做吗,我就说了回溯,然后就说噢这题就可以回溯,回溯的时候判断就好。还好没让写,毕竟我写回溯很容易出错😂。
21. 反问
其实我也没什么想问的,就像征信的问问常见问题。
Q:部门用的python和go吧,如果通过的话需要学些什么框架呢?
A:列举了诸多框架,还讲了字节自己的一个框架,说如果想学的话可以去找开源的gin。
Q:有什么个人建议吗?
A(笑着说):我只是个面试的,不好给你提建议啊。😂
Q:那有什么学习方法推荐吗?
A:这个每个人的学习方法都是不同的,有的人喜欢看书,有的人喜欢看博客。
Q:好了没问题了,辛苦您了!
基本上的问题都重现出来了,深度回忆快榨干我了
总体来说真的偏基础,跟我网易二面简直是一个天堂一个地狱。。。
自我复盘的话:符号引用和直接引用,类加载的打破,代理,mysql的日志,图。这几部分说的不咋好,要回去重温啦。
可能是真的很缺人吧,看一面面试官说的【做都做不完的需求】就能看出来了哈哈哈
最后我不行了我好困我去睡大觉了,明天网易hr面,加油吧。
希望大家都能收割到心仪offer
全部评论
(37) 回帖