4.29 字节春招截止倒数第二天,杭州Java商业变现部门暑假实习,隔天挂,春招结束(人生的第一份简历,嗯就开始即结束
6.15 字节提前批开始的前一天,杭州飞书日常实习部门,隔天挂,实习结束
6.19 收到字节笔试邀请,才知道原来求职有【捞】这个操作,果断参加,迎来人生的第一次笔试 => 0ac(实在不会用Java的输入输出。。。),后来第二波笔试ac2.x
6.29 收到了hr的电话通知面试通过开始约面试,于是长达半个月的三面开始与结束,最后三面挂了哈哈哈
中间被北京鞭尸两次,都拒了,后又被深圳捞起来,hr小哥哥说可以考虑是一次新的机会,我就答应了。
一个插曲:
我:我现在在厦门实习
hr:厦门美团吗?
我(连忙):小公司小公司小公司(最怕空气突然安静)
没想到今晚直接面完两面,字节的效率和面试官的态度就我个人而言,五面的经历都很不错,会引导,也不会非常严肃,我第一次面试的那个面试官应该是最严肃的了 然后我个人不喜欢录音,通常都是靠记忆来复盘的,这次直接两面我脑容量有点不够,我的脑子不太会响应缺页中断,主要是因为饿了,没吃晚饭,所以会乱序+遗漏就不要在意了
一面 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. update操作不会判断事务指针吗? 说了不会,实际上这里我也有点疑惑,挖个坑好了,之前一个小伙伴跟我说是update是会执行当前都然后上写锁,我觉得有点不对劲,待解决。
10. undo log是用来做什么的?事务提交的时候会提交什么日志? undo log是用来实现回滚和mvcc的。事务在执行过程中会不断写入redo log buffer,然后满足策略(三个策略供选择:交给master thread;buffer只剩一半的空间;事务提交)的时候会写入redo log file,以及提交的时候会写入binlog。
11. redo和bin的提交顺序呢?
12. undo log 和 redo log的区别?分别记录了什么?binlog呢? undo log是存储引擎层的日志,是一种逻辑日志,记录的可以说是一个反逻辑的sql;binlog是数据库层次的日志,记录了对数据库增删改的sql;redo log也是存储引擎层的日志,但是是物理日志,然后记录了什么我一下子忘了就说了不知道,实际上应该是记录了对数据页的修改吗?
13. 数据库会把数据持久化到磁盘为什么还要redo log来做持久化? 这个其实是我前面的表述问题,redo log是做事务持久化的,是我没注意到。
14. 算法 力扣原题:82.删除排序链表中的重复元素II,我以为我做过的,实际上搜到的时候现显示没有提交记录(?
https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii/
一开始想一次遍历来做,发现总是绕不开,就改用递归了,跟面试官先说了思路后写了主要逻辑,然后通过。
中间有两个小插曲,一个是一开始编译总是过不去显示非法字符,我以为是输入输出有问题,最后面试官提醒我说你用了中文的分号
还有一个是可能一开始hr没沟通好,我做题做到一般面试官突然下线然后二面面试官上来了,跟我说你是来应聘后端开发工程师的吧blablabla,我说是,然后我说我有个问题:我刚刚才面试到一半,还在做题呢
15. 反问 万年不变的问您觉得这里的工作氛围如何?
面试官说突然问这么广啊,我觉得还好吧就互联网公司嘛,身边年轻人也挺多的,压力也挺大,每天有做不完的需求
解释了下刚刚提前上线的情况,然后说我们重新认识一下 二面真的记不清了,比较基础的题我也就不详细写了哈。
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的日志,图。这几部分说的不咋好,要回去重温啦。
可能是真的很缺人吧,看一面面试官说的【做都做不完的需求】就能看出来了哈哈哈 最后我不行了我好困我去睡大觉了,加油吧。
最后给大家分享些我一直在刷的面试题还有思维导图,个人感觉还不错首先要有一个完整知识架构思维图仅仅暂时部分需要点击下载所有原件
因为涉及的知识面太广了,不能把所有的学习笔记和面试题目全部展示出来。笔者这里已经都整理好了,有想获取到学习参考的朋友可以可以点赞关注一下点击下载所有原件
Java基础笔记总结
基础面试题目及答案
性能调优笔记总结
性能调优面试题目及答案
分布式笔记总结
架构知识笔记总结
Redis核心原理和应用实践
Netty实战
关于架构方面的实战文档和面试题目及答案,这里就不一一例举了。(关注点赞后,点击下载所有原件)