面试
腾讯一面
- 算法题四道:String转int(O(n)),数组实现stack(O(1)),一串数字中出现最多次数的(O(n)),LRU(O(1))
- Spring相关:Spring事务实现,事务的传播性,什么情况失效, bean的生命周期
- 锁相关问题,cas相关问题,容器数据结构相关基础问题,jvm相关基础问题
- 耗时2小时
腾讯二面
- 了解过什么开源项目,请将出优点,画出架构图,他为什么要这么设计,和其他相比有哪些优缺点
- 你上个次面试写的环形队列有没有什么bug,这个环形队列在哪些场景是很适用?,如果在高并发场景这个环形队列有哪些问题,请通过编码解决这些问题
- ping的延迟100ms,http访问最少多少?一次http请求,客户端什么时候知道他结束了?http对应状态码的信息,300代表什么,502代表什么
- 我说我熟悉redis,问题redis源码(只能尴尬的笑了笑)
- 耗时一个半小时
腾讯三面
- 手写一个二维的随机地图,类似于扫雷的地图。给出行号,列号,雷的个数,要求随机。写完后没要你运行目测bug(bug是随机的碰撞)。自己看出bug后改,随后问时间复杂度,最好的时间复杂度,最坏的时间复杂度,平均时间复杂度。再问优化如何降低你的时间复杂度(我的思考是从减少随机碰撞,将其用linkList优化,但时间复杂度并没有好的转变)。问其他排序算法的时间复杂度(最好,最坏,平均)。
- tcp与udp的区别,编写过网络代码嘛,实现过udp,tcp的网络通信嘛,udp客户端如何确定包已经接受完
- 你觉得go,python,java 他们之间的优劣。java在编写web方面和python比哪个更好?我想必定是java巴拉巴拉说了一些,面试官反问了一句,你知道豆瓣和知乎是python写的嘛。你用python感觉到他编写时与java的哪些不同,他的优点是什么?他的内存模型是什么?(内存模型答不下去了,下一个话题)
- 说一下java虚拟机的内存区域,随后以你写的算法为例,说出你写的代码里面对象,方法,类,局部变量存放在哪些区域。java对象一定在堆里面嘛?(回答不一定,有逃逸分析),谈一谈逃逸分析(忘了具体了)
- 熟悉redis嘛,我说还可以,我要将其内存扩容(尬住)。我说只是熟悉其数据结构。问题了解zset吗?说一说其数据结构(跳表),为什么不用树,优缺点
- 有没有写博客习惯,我把我的笔记给面试官看了(面试官建议我放在github,不然本地出现问题就会丢失)
- 面试官点评,计算机网络那块明显不够,推荐我去看几本书(书籍放在最后)
- 耗时一个多小时,体验感超级好
四面
- 这一轮是人事面,耗时一个小时
总结起来,计算机网络比较差,基本都折在计算机网络。侥幸,面试全部划过去了
自顶向下计算机网络 ---推荐
unix网络编程 ---推荐设计原理,实践
深入理解计算机系统 --组成原理相关
http如何确定发送完成
http如何确定请求已经发送完毕
https://blog.piaoruiqing.com/2019/09/08/do-you-know-content-length/
-
对于有content-length 来确定大小,如果实际发送的大小与content-length不相符,则会出bug
-
如果Content-Length比实际的长度大, 服务端/客户端读取到消息结尾后, 会等待下一个字节, 自然会无响应直到超时.
-
如果Content-Length比实际的长度小首次请求的消息会被截取
-
Content-Length首部指示出报文中实体主体的字节大小. 但如在请求处理完成前无法获取消息长度, 我们就无法明确指定
Content-Length, 此时应该使用
Transfer-Encoding: chunked
什么是Transfer-Encoding: chunked
数据以一系列分块的形式进行发送. Content-Length
首部在这种情况下不被发送. 在每一个分块的开头需要添加当前分块的长度, 以十六进制的形式表示,后面紧跟着 \r\n
, 之后是分块本身, 后面也是\r\n
. 终止块是一个常规的分块, 不同之处在于其长度为0.