腾讯CSIG后端研发实习生面经

一面(电话面86分钟)

自我介绍一下
项目
Java基础
equals()和hashcode()?为什么重写equals要重写hashcode?
如果自定义了一个对象,仅仅重写了equals方法。
对于HashMap来说,两个对象的值相同,但由于没有重写hashcode方法,默认hashcode会以对象的内存地址进行计算,这样导致HashMap进行put操作时相同的对象在HashMap的hash取模后分配到不同的桶中。
HashMap原理
put、get、扩容、loadFactor。
线程安全吗
不是的
多线程有什么问题?
多线程put的时候如果扩容,会导致形成循环链表,这样get的时候就会陷入死循环
还有别的问题吗?
就是大部分并发都存在的问题吧,临界区资源没有上锁会导致脏读、丢失更新什么的。
详细说下
就两个线程同时put同一个key,那有一个线程的value就丢失更新了。或者某个线程同时get了某个key,这个key又被其他线程修改了,脏读了。
还有没有别的问题
不知道了,你能跟我讲讲吗?
面试时间有限,网上自己查查吧

ConcurrentHashMap原理
分段锁,底层实现为CAS结合volatile。
CAS是什么
巴拉巴拉,它存在ABA问题。

JVM虚拟机
巴拉巴拉巴拉
可以了

数据库
巴拉巴拉巴拉,我就不详细展开了,但是都知道的

可以了,看你简历上写了Redis,问点问题啊,有哪些数据结构?
五种,巴拉巴拉
你知不知道多个连接过来Redis是怎么处理的?
Redis基于Reactor模式开发了自己的网络事件处理器:文件事件处理器。
文件事件处理器采用了I/O多路复用程序,可以同时监听多个套接字,然后根据当前套接字的不同任务关联不同的事件处理器。
文件事件处理器由四个部分构成:套接字、I/O多路复用程序、文件事件分派器、事件处理器
多个客户端同时get会怎么样?
并发产生多个I/O事件的情况,I/O多路复用程序会把产生事件的套接字都放入到一个队列里,然后通过这个队列,以有序的、同步、每次一个套接字的方式向文件事件分派器传送套接字。当上一个套接字产生的事件被处理完毕之后(该套接字为事件所关联的事件处理器执行完毕),I/O多路复用程序才会向文件事件分派器传送下一个套接字也就是说,多个客户端同时get,只有一个客户端能正常执行,其他的客户端请求被阻塞。
算法
两个链表找第一个公共节点?
第一次遍历通过HashMap记录节点,第二次遍历链表二,找到第一个相同的就退出。时间O(n),空间O(n)
继续想想
遍历两个链表,计算长度差,然后让长的链表先走长度差步,然后让两个指针一起以相同速度往前走,每次判断两个节点是否相等。时间O(n),空间O(1)
还有别的想法吗?
没有了
已经给出最优解了,但还有其他解法,提示一下,用栈来做这个题
维护两个栈,把第一个链表的节点全部压入栈A,把第二个链表的节点全部压入栈B,然后不断从A、B栈中弹出元素,直到弹出的元素不相同,那么上一个弹出的元素就是两个链表中第一个相同的元素。时间O(n),空间O(n)

找数组中多于一半的元素
哦哦,这个题我见过,Leetcode原题嘛,可以用摩尔投票算法,思想就是每次消除两个不相同的元素,最后剩下有可能就是多于一半的元素。实现是设置一个计数器count记录出现最多的元素的次数,和一个变量major记录当前出现最多的元素。然后遍历数组,如果count=0,则把major置为当前元素,如果遇到的数和major相同,则count+1,不同则count-1。扫描完成后,最后的major就是数组中出现次数最多的元素,再次扫描数组,计算major出现的次数,判断是否大于1/2次。时间O(n),空间O(1)
还有其他思路吗
排序,然后数组的1/2处就是出现最多的元素,再扫一次判断是否 出现次数超过数组长度的1/2。时间O(nlgn),空间O(1)
这个明显效率不太好,你还有其他想法吗?
没有了
你再想想?提示一下,听说过线性选择算法吗
哦哦,我知道了,就是其实就是用快速排序的中间过程,partition结合二分,每次随机选择一个数,把比他小的排在左边,比他大的排在右边,直到选中数字的下标最终被排在n/2的位置,就说明左边都比他小了,右边都比他大了。这个数字就是中位数,然后再扫一次数组,看看这个数字出现次数是否超过n/2。

Linux命令
看网络用什么命令?
netstat
看某个进程占用的端口号?
netstat -ano?不知道啊,我只知道lsof -i:端口号 可以查看占用该端口对应的pid。
怎么看Java进程中哪个线程的cpu占用最高?
不会,是用啥啊
top -H -p + 进程号
好的
怎么查找某个文件的某个字段?
find 路径 -name 文件名 | grep 字段名
怎么定位内存泄漏?
用jmap把内存dump下来,然后再用工具分析堆栈。
怎么看已使用的内存?
通过阿里云控制台看,他们这个很成熟了啊,什么内存、CPU、TCP链接数、磁盘空间都能看的(跟腾讯面试官吹阿里云会不会被打死)。
用命令会吗?
思考…好像是free吧,查看磁盘的是df
free打出来的参数都有理解吗?怎么看已使用的内存?剩余内存?used准确吗?
不知道啊,好像是通过某几个列的量可以准确计算出来吧。
好的

智力题
一个班一共100人,喜欢足球60,喜欢篮球70,喜欢排球80,问同时喜欢足球和篮球的有多少人?你先想想,我过几分钟再来
想好了吗?
没有
想好了吗?
不会,我觉得应该是一个范围,喜欢足球和篮球的最多有60人,最少不知道。
没事,小问题就不纠结了,你有啥问题吗
你们团队多少人啊
这个,不方便透露啊,如果后面你来的话就知道了
你们做什么的
在线教育…
好的,没问题了

二面(电话面试40分钟)
熟悉什么语言
Java、C++、Python
Java知道哪些数据结构?
线程不安全的:
Map:HashMap、LinkedHashMap、TreeMap
Set:HashSet、TreeSet
List:ArrayList、LinkedList
Queue:PriorityQueue
Stack

线程安全的:
ConcurrentHashMap、LinkedBlockingQueue等
几种Map的区别是什么
巴拉巴拉

对网络编程熟悉吗?
还可以
NIO和BIO之类的了解吗?
五种I/O模型:
1)阻塞I/O
2)非阻塞I/O
3)I/O复用(select和poll)
4)信号驱动I/O(SIGIO)
5)异步I/O
怎么理解阻塞I/O?
假设有一个管道,线程A从管道中写数据,线程B向管道中写数据。
首先讨论缓冲区的概念,缓冲区的引入是为了减少频繁I/O操作而引起频繁的系统调用(它很慢的),当你操作一个流时,更多的是以缓冲区为单位进行操作,这是相对于用户空间而言。对于内核来说,也需要缓冲区。
缓冲区满之后,产生I/O事件,告诉线程B去读缓冲区,同时线程A阻塞。
缓冲区空之后,产生I/O事件,告诉线程A去写缓冲区,同时线程B阻塞。
在阻塞模式下,一个线程只能处理一个I/O事件。

链表找环
快慢指针,时间O(n),空间O(1)
有其他想法吗
HashMap或者Set存储节点,第二次找到相同节点则存在环。

Redis
了解Redis吗?
了解的
Redis为什么比其他数据库高性能?
Redis是内存数据库,内存就比磁盘快。
还有吗
Redis是单线程单进程的设计
还有吗
不知道了
你了解Redis的扩容吗?刚才说HashMap冲突之后会拉出链表、红黑树,Redis里面是怎么做的?
Redis里面为啥会冲突啊,Redis的key只有String啊,不是直接覆盖吗?
巴拉巴拉(我没听懂)

我给讲下Redis的String吧,他的扩容是这样做的。
通过一个变量未使用空间,SDS实现了空间预分配和惰性空间释放两种优化策略,比C的char有一些优势。

  • 常数时间复杂度获得字符串长度
  • 杜绝了缓冲区溢出
  • 空间预分配和惰性空间释放减少了内存重分配次数
  • 二进制安全
  • 兼容部分C字符串函数

还有啥问题吗?
Redis为什么高性能?
emmm,比如,字典的rehash的详细过程可以了解下的。

三面(视频面40min)
项目中有什么技术难点?
粘包、半包?
粘包怎么做的?
报文格式是怎样的?
头尾是FF?那么你们数据字段中不可能存在FF?
还有别的吗
TCP链接数异常
你是怎么发现这个问题的
我们节点部署在阿里云上,阿里云后端管理平台可以看到TCP连接数异常
什么叫TCP链接数异常?
就是后端看到的TCP链接数比正常高
TCP链接处于哪个状态?
忘记了
为什么会增多?
由于用户可能同时下线,并发修改那个map会报错,就改成同步的map的,然后就不报错了,就可以正常释放TCP链接了
没道理啊,客户端下线之后,TCP链接肯定会释放的(严肃脸)
不知道啊,可能是我做了太久了有点不记得了吧

怎么处理多任务
多线程、多进程
他们的区别是什么
巴拉巴拉
一个线程可以做到吗?
可以,I/O多路复用器就可以做到,通过eventLoop。
还有别的方式吗?
协程
怎么理解协程?

  • 进程和线程都是操作系统进行调度的(System call),而协程由程序员写代码去调度,也就是说不需要从用户态切换到内核态。
  • 协程不是抢占式的
  • 不用加锁

场景题:
给两个文本,怎么判断他们的中心思想类似?
分词,统计词频,找出TOP K名词,对比两个文本TOP K名词的交集,以交集/全集
那如果,两个文本词的频率一样,顺序不一样呢?
哦,我理解的是名词可以代表这篇文章的中心思想了,你这么说的话,要继续考虑语义,可以用一些语义分析的算法。
过于复杂了,有没有简单一点的想法,你可以考虑用一些字符串的算法?
不知道诶
LCS知道吗?
知道的,最长公共子序列?这个可以用来判断两个文本中心思想是否相似吗?不太知道
那你说下LCS的实现吧
讲了下递推公式,以及根据求出的标记表再回溯求字符串。
自己实现过吗?
本科就写过了,研究生也写过,要不要写一个?
不用

讲一下浏览器发起请求到浏览器解析出html的全过程
1.应用层通过url解析出ip(DNS解析的过程)
2.应用层发送HTTP请求:HTTP请求包括请求报头和请求主体两个部分,其中请求报头包含了至关重要的信息,包括请求的方法(GET / POST)、目标url、遵循的协议(http / https / ftp…),返回的信息是否需要缓存,以及客户端是否发送cookie等。
3.传输层三次握手,建立链接,发送TCP报文。
4.网络层通过ARP协议把IP地址解析为MAC地址,此外在网络层进行IP报文的转发,有各种路由算法去寻找下一跳。
5.服务器端在数据链路层接受到报文,然后层层封装传到上一层
6.服务端返回http响应报文
请求返回的状态码知道吗?
知道的,200成功,300重定向,400客户端错误,500服务端错误
302是什么?
301是永久性的重定向,302是临时性的重定向。
304是什么?
不知道
文件未变化,客户端缓冲的文件可以继续使用
好的
怎么抓包知道吗?
wireshark、charles等工具,之前用过去抓TCP报文,解决了一个棘手的问题,写爬虫的时候也会用来分析一下哪个请求是我要的,他的cookie是啥之类的。
cookie怎么理解?
由于http是无状态的,session会保存每个用户的登录状态。
简单来说,Cookie是服务器给客户端发的一个「通信证」。
本质上,cookie就是浏览器存储的客户的一些信息,以kv的形式存储在文件中,比如说用户的登录账户和密码,下次请求同一网站的时候,浏览器直接读取文件把cookie放到http header中发给服务端。

C++懂吗
会一些基础的东西,写过算法题,STL会用,没做过项目
字节对齐知道吗
主要就是针对struct做了字节对齐,用空间换时间,提供效率,因为有的CPU不能随意读取内存,必须从特定位置开始。

你想去上海?
是的
为啥?
来深圳能接受吗?
我觉得城市都可以的,实习主要还是看技术成长,看部门,反正在南京读的研究生,除非找本地的公司,否则去哪都要租房,只是来回的时间长短问题。

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值