猿辅导 服务端开发 一面凉经

开局自我介绍,没有问特别细的技术细节,主要问了一些项目上的一些小内容(10min)
(后续问知识点用了26分钟,余下30多分钟就全在写题,就一题还不是很难,我手写能力还是不太过关。)
然后让讲讲对hashmap结构的理解,我就从put、set、resize三个方法详细的介绍了一下(hashmap组合拳)(o(1)数据迁移感觉没讲好,回头想想该怎么讲,理解是理解了)
你刚刚谈到了hashmap是由数组+链表+红黑树组成的,为什么不直接用数组+红黑树不用链表呢?(我说红黑树的维护成本是大于链表的,所以如果可以的话肯定是用链表最划算。通过泊松函数可以发现在链表长度为7时,发生哈希碰撞的可能是百万分之一)
用java代码来表示一棵树会吗(新建一个类,里面包含左子树指针右子树指针这样吧)
垃圾回收的话,对现在的主流的垃圾回收器有所了解吗?(我说我主要了解parallel Scavenge、CMS、G1这种,对再新一点的不太了解)
对比一下CMS和G1的优缺点(CMS更侧重于更短的停顿时间,G1的话更侧重于可控制的停顿时间,G1的话最突出的特点在于它会将内存分为多个相同大小的区域,区域大小是2的幂次方,这样从全局上来看是标记整理算法,从局部上来看是复制算法,这样相对于CMS就比较快捷,停顿时间较少,CMS在并发标记和并发清除阶段会产生很多浮动垃圾,而G1的话应该比较少)(这边我差点就打算把CMS和G1的整个流程讲一遍了,我感觉这样应该不太对就没继续讲)(口误也比较多,人比较紧张)
G1有什么缺点吗?(我没想起来G1有啥缺点,就说不太清楚)
看你简历里面写了了解单例模式和工厂模式,能讲讲这些一般用在那些场景吗?或者哪些实际的框架会用到?(我说我不太清楚在哪些框架里面用到,场景的话大概是这样的,工厂模式是为了能够让用户与实际生成对象的过程隔离开来,用户只需要去请求,工厂类就能够针对用户的请求返回对应的对象;单例模式的话是为了让某些对象只生成一次,不希望一个对象被多次创建)
那么一个对象如果被多次创建可能会有什么问题吗?(可能会造成内存上的浪费)
计算机网络的话,你能讲一下为什么TCP是三次握手而不是四次呢?(一般来说建立连接是四次握手,目的是让客户端和服务端都能够确认自己的收发能力,各自确认收发就需要四次。不过服务端接收到第一次握手的信息后,可以将要发送的确认信息与接下来的请求信息合并,这样就可以将四次握手缩减为三次)
如果说客户端的第三次握手在网络中丢包了,那么服务端会怎么处理?(我说会根据超时时间来处理,如果超时了还没收到消息那就当此次连接失败,之后发送来的此次连接的相关信息也会无视)(感觉说的不对)
那么在四次握手的途中,如果中途客户端直接断开连接了,服务端会怎么做?(我说也会进行一个超时判断,如果超时了那就发送一个心跳包给客户端,这个心跳包也超时了的话那么就认为连接已经断开了)
所以你认为TCP的话是维护了每一个连接最后收到包的时间,然后有一个定时器这样的东西是吧(我说是的。我感觉前面应该是哪里说错了,考官想最后确认一下)
数据库的话,在哪应用过吗?(我说我实际没有很多的用过,但是对数据库的索引,B+树有所了解)
也就是你的项目里没有用过数据库是吧?(是的)
数据库我们知道有很多种的底层数据结构嘛,比如B树B+树,你能讲讲其中的区别吗?(B+树的话相对于B树最主要的区别在于它的行数据都存储在叶子结点上,中间节点上存的是能够定位行数据的主键信息,而B树的话则是将行数据直接存在了中间结点上。这样的话,B+树的查找效率就比较稳定,而B树的话可能有的查找中途就返回了,有的要查找到最后。同样的因为B+树的中间节点只存了主键信息,所以内存可以加载比较多的数据页,查找速度更***觉讲的有问题)
还有很多其他的数据库用的是B树,性能也不比mysql差,你能想一下为什么他们要用B树吗?(我只能说可能对于精确查找比较有需求所以用B树)(不知道咋答,没见过这问题)
主键和唯一索引的区别?(我直接傻了,唯一索引不就是用主键信息建立的索引嘛?这咋答,只能支支吾吾的答一下)
对于数据库的事务有了解过吗?(我说我大概了解过,ACID之类的)
那么知道事务的隔离级别有哪几种吗?(读未提交,读已提交,可重复读,串行)
有了解过在什么时候用什么等级吗?(不太清楚,但是我知道级别越高,并行能力越差,级别越低并行能力越好,但更容易出错,所以可能越往下的话越可能在一些并发量较大的场合下使用,考官说行)
对于线程与进程的概念了解吗?(了解的,然后刚要打这么一套组合拳就被考官叫住了)
我想问的是,java的线程的生命周期中有几种状态?(答的有问题,答了就绪态、运行态、阻塞态、超时阻塞态、最后死亡)
那么超时阻塞和别的阻塞有什么区别呢(我这边答了sleep和await的区别)
那么sleep(0)知道用来做什么的吗?(我说不太清楚)(应该是起到一个线程放弃当前CPU时间片,从而重新进行CPU时间片竞争的这么一个效果,目的应该是为了避免一个线程占有CPU时间过长)
为了提高程序的并发能力,我们有时候会用多线程,有时候会用线程池,这两者有什么区别呢?(线程的销毁创建开销过大,用线程池可以避免)
有一种线程池是单线程的,那么它和普通的单线程有什么区别呢?(线程池有阻塞队列,所以能够直接给它不断的提交任务,做完一个就自动做下一个,如果只是普通的单线程的话我们可能需要在外面自己实现一个这样的阻塞队列)(感觉答的不对,不知道怎么答)
线程池的线程数应该怎么应对实际的场景来设置?(不知道咋答,就说了核心线程数按照CPU核心数量设置,然后可以丢弃请求的话最大线程数少一点,不可以的话最大线程数就要大一点)

最后算法题是给定两个闭区间序列A和B,输出合并后的闭区间序列
例如A是[1-3][5-7]两个闭区间,B是[2-4][6-8][10-13]三个闭区间,合并后输出[1-4][5-8][10-13]三个闭区间
我说我的思路是A和B各自取最前面的区间比较,写一个check函数来判断区间是否有重合,有重合就合并,最后再对整个序列做一次最后合并。考官说没问题我就开始写了,写了半天最后的对整个序列的合并没写出来,报越界,人傻了。考官就说行我知道了。前面的输出没啥问题。
最后反问,因为我前面我感觉讲的海星(其实是忘了前面有啥没讲出来的了),所以就直接问了这个题有没有其他简便方法,他说基本就是这个思路,不过一般来说都是直接合并就行了,当然也有人是这么合并的。

感觉考官人还是挺好的,和之前其他考官不一样的在于他问了一个知识点如果我没有立刻反应过来的话他会继续对这个问题进行解释,从其他的角度来问这个问题。有的问题从A方向来问我没听过就不知道该怎么答,但是从B方向来问我就会答了。这样的考官给的面试体验还是挺好的,至少不会后续感觉自己其实会答但是没答成功的情况了。
希望能有二面吧。










#面经##校招##猿辅导##Java工程师#
全部评论
搜了一下,mongodb就是用的b树 。看了楼主面经,自己学的还是太粗浅了。共勉吧。
点赞 回复
分享
发布于 2020-08-31 14:32
这面经太赞了
点赞 回复
分享
发布于 2020-08-31 17:19
乐元素
校招火热招聘中
官网直投
祝楼主好运,觉得基础部分答得不错的话,算法没写出来影响不会那么大,还是看综合表现和个人背景的
点赞 回复
分享
发布于 2020-09-01 16:03
很有用,学习了
点赞 回复
分享
发布于 2020-09-01 16:08

相关推荐

5 19 评论
分享
牛客网
牛客企业服务