面试

腾讯一面

  • 算法题四道: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/

  1. 对于有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.