腾讯【CDG广告】后端开发实习一、二面面经和参考答案
之前的一篇抖音的秋招面试经历的链接在这,需要的同学点击传送门:https://www.nowcoder.com/discuss/834599?source_id=profile_create_nctrack&channel=-1
1. 前言
2021年4月面的腾讯cdg的实习,一、二面面经一起总结在一起了,这个部门和大数据联系比较紧密,技术栈是Java和Scala这些。我只会Java,所以面经相关的问题也都是Java的。
总体来说二面的八股文比较常规,但一面有点难,这确实和面试官有关系。
2. 面经问题汇总
2.1 八股文
- 常规(基本都是二面问的)
- 1 死锁产生的条件是什么?
- 2 TCP/IP 三次四次。
- 3 JVM内存结构讲讲
- 4 Java的锁有哪些,尽可能说你知道的就行。
- 5 sychronized和Lock锁的区别,承接上一个问题。
- 6 TreadLocal 是干啥的?能否简单讲一下?
- 7 outterJoin和InnerJoin的区别?
- 8 简历里写了了解设计模式,你是如何理解设计模式的?
- 进阶
- 9 要给很多学生的高考成绩进行排序,用什么算法?
- 10 如果一个后台的服务跑着跑着挂了,你觉得是什么原因?
2.2 算法题
- 11 二叉树的Morris遍历(一面)
- 12 n个一组反转链表(一面)
- 13 字符串转整数(二面)
3. 答案
3.1 八股文答案
1 死锁产生的条件是什么?
2 TCP/IP 三次握手四次挥手
三次握手:客户端的连接请求:首先客户端发送一个带 SYN 标志位的连接请求到服务器,客户端进入 SYN-SENT 状态。
服务端的连接确认请求:服务器收到之后回复一个 SYN 和 ACK 的确认报文到客户端,此时服务端进入 SYN-RECV 状态,等待第三次握手。
客户端的连接确认请求:客户端接收到确认报文后,向服务端再次发出带 ACK 的确认报文,后客户端这边连接建立,服务端收到客户端的第三次确认报文后,连接建立。
为什么要三次握手?从第一个角度。通信是双方的行为,双方都需要确认四件事,自身的接收发送是否正常以及对方的接收发送是否正常。如果仅两次的话,服务端是没有办法确认自己发送和对方接收是否正常的,不是可靠的连接。从第二个角度。也可以防止失效连接到达服务器后重新打开连接。客户端发送的请求如果阻塞。那么客户端等待一个超时重传时间以后,会重发一个连接请求。假设这个来迟滞留的请求最终到达了服务器,如果不三次握手的话,服务器就会打开两个连接。如果有第三次握手,客户端就会忽略掉服务器之后的连接确认请求。
四次挥手:客户端发送一个带 FIN 标志位的关闭连接请求,此时客户端进入 FIN - WAIT - 1 阶段。服务器收到该请求后,返回一个 ACK。客户端收到 ACK 之后,进入 FIN - WAIT - 2 阶段,此时处于半关闭状态,服务器能给客户端发消息,但客户端不能给服务器发消息。当服务器把剩下的消息发完之后,会发送一个 带 FIN 标志位的关闭连接请求给客户端。客户端收到该请求后,发出 ACK 确认,并进入最后的 TIME - WAIT 状态,等待 2MSL(最大报文存活时间) 后释放连接。B 收到确认后,释放连接。
为什么要四次挥手?服务端在收到客户端的 FIN 报文后,仅表示客户端不在发送数据了,但客户端还可以接,而服务端也不是说数据都发完了,所以服务端可以立即关闭,也可以再发送一段时间的数据后再发送 FIN 报文给客户端表示同意关闭。因此服务端的 ACK 和 FIN 标志位会分开发送,在 ACK 和 FIN 之间可能还会给客户端传数据,导致多了一次。
3 JVM内存结构讲讲
分两块儿讲,线程共有的和线程私有的来讲。
- 线程私有
- 程序计数器
- 虚拟机栈
- 本地方法栈
- 线程共有
- 堆空间
- 方法区
- 直接内存
4 Java的锁有哪些,尽可能说你知道的就行
说了只了解sychronized和lock锁
5 sychronized和Lock锁的区别,承接上一个问题。
6 TreadLocal 是干啥的?能否简单讲一下?
我总结的文档,面试不用说这么多,点出ThreadLocal是如何实现的就行了:http://note.youdao.com/noteshare?id=29ffa7b20e697cb2408451db7a03bda4&sub=DE005AAA30264B79801683634B134EA4
7 outterJoin和InnerJoin的区别?
8 简历里写了了解设计模式,你是如何理解设计模式的?
推荐大家去看一下《Head First 设计模式》的一些内容,不要把中间的引导语忽略,我就是看着引导语才有一种醍醐灌顶的感觉。
我当时的回答是这样的:设计模式其实就是为了把代码中变化的部分和不变的部分给尽可能的剥离开,使得代码的可维护性大大增强。总的来说就是:程序设计的三大原则是最终的目的!设计模式是方法论!继承、多态是实现的基础!
9 要给很多学生的高考成绩进行排序,用什么算法?
桶排序。
10 如果一个后台的服务跑着跑着挂了,你觉得是什么原因?
之前看到过一个很好的思路,从大到小的去找。
- 网络原因(机房抖动)
- 机器层面
- 宿主机问题(硬件上的问题)
- 虚拟机问题(cpu打满、内存打满、IO过高假死)
- 中间件问题(Redis击穿了,Kafka废了)
- 下游服务挂了
3.2 算法题
11 二叉树的Morris遍历(一面)
会有这种遍历方法是我万万没想到的,我觉得这不用死记硬背,能看懂答案,说出思路就可以了。。感觉也不会有太多面试官会考这个遍历方法的。
12 n个一组反转链表(一面)
必刷题,不啰嗦了。
13 字符串转整数(二面)
比较简单,不啰嗦了。
#实习经验分享##实习##春招##腾讯##秋招#