一、背景
也记不清楚是在哪里给陌陌投的简历了,面陌陌的前天面了字节,刚好面字节的时候做了个 TOPK 的算法题,于是面完以后看了看TOPK的实现(快排和堆),结果今天面陌陌刚好问到了这个,面试的时候差点笑出声来(doge)二、面试
一面
一面的面试官是个小哥哥,颜值比较高,人也很好,简单说两句之后就开始面试了1.自我介绍
2.本科和研究生阶段印象最深刻的课程
答:计算机网络、数据结构(楼主本科是物联网工程,偏硬件多一点,但是对硬件不敢兴趣,所以研究生转了软件。猜测问这个问题的意思肯定是要继续深挖下去,于是说了自己最近着重看的两门学科)
3.说一说TCP和UDP的区别
答:(这个真的问烂了,基本每一次面试都会有)
4.说一说TCP是如何保证可靠传输的
答:(其实是想问拥塞控制的实现)流量控制、超时重传、拥塞控制(把面试官想问的放在最后,这样他大概率只会问他想问的了)
5.说一说拥塞控制是怎么实现的
答:慢开始、拥塞避免、快重传、快恢复(这里展开说了细节,篇幅太多不放了)
6.说一说三次握手的过程
答:(这个也问烂了)
7.数据库如何优化?
答:(一开始答的是主从复制、分库分表这些,后面才明白是想问索引)用explain字段分析sql语句,看有没有走索引
8.说一下联合索引是什么
答:例如有三个字段A、B、C,对这三个字段建立一个统一的索引,而不是分别建立索引。
9.如果有一个联合索引,我只查其中一个字段,会走索引吗
答:(这里有个坑,要根据情况分析)如果只查一个字段的话,看是不是符合最左匹配原则,如果是的话就走索引,不是的话不走索引
10.redis有哪些数据结构
答:string、list、hash、set、sorted set
11.redis的一个string能存多大的数据
答:不清楚(查了一下好像最大能存 512M 的数据)
![image.png](http://116.62.53.133:8090/upload/2020/07/image-ff9a194badd44e00b2fce990324d2d79.png)
12.hashmap了解吗,说一下底层实现
答:JDK1.8以前底层是数组加链表的形式、JDK1.8以后改成了数组加链表加红黑树的形式,加入红黑树主要是为了解决链表长度过长时,搜索的时间复杂度是线性级别的问题
13.链表长度超过多少会转换成红黑树
答:默认的阈值是8
14.当调用hashmap的get函数时怎么获取数据的
答:首先根据key的hashcode值找到对应的存储位置,然后通过equals方法来比较内容是否相等
15.如果get方法发生hash冲突了,在链表上是怎么找到你想要的那个数据呢
答:应该是遍历这个链表(一开始有点不确定,后来面试官问除了遍历链表还有其他方法吗,然后更加不确定了,想了想说的还是遍历,后面面试官说确实是遍历)
16.hashmap是线程安全的吗?如何让他变成线程安全的
答:(两个问题合到一起)用hashtable或者concurrenthashmap
17.这两个是如何保证线程安全的
答:hashtable是用全表锁,锁住整个链表;concurrenthashmap在JDK1.7用的是分段锁,将数组分段,每次锁住其中一个段,JDK1.8以后用CAS+synchronized操作对数组的每个节点进行加锁
18.你刚刚说的这个CAS是什么,会导致什么问题
答:CAS是比较并交换,乐观锁的一种实现方式,会产生ABA问题(至于什么是ABA问题,可以百度一下)
19.那怎么解决ABA问题呢
答:可以增加一个版本号,每次修改数据之后,版本后都加1
20.CAS还会有其他问题吗
答:(这个没怎么答好,面试官帮我补充了一下。CAS内部是一个do-while循环,在尝试更新某一个变量但是不成功的时候,会一直执行这个循环,会给CPU带来很大的压力)
21.GC机制了解吗?有哪些垃圾回收算法
答:标记清除、标记整理、复制
22.CMS用的是什么算法
答:(一开始答的是标记清除、后来面试官问了问确定吗?然后有点犹豫了,想起来CMS就是 Concurrent Mark Sweep,Mark-Sweep 就是标记清除的意思,于是说确定)
23.CMS有哪些阶段,那个阶段会stp
答:初始标记、并发标记、重新标记、并发清除。重新标记阶段会stp
24.还有哪个阶段会stp
答:好像只有重新标记会(后面面试官说初始标记阶段也会stp。这个题我是直接背下来的,但是没记清楚,后面想想,除了并发标记和并发清除这两个阶段垃圾回收线程和用户线程会并发执行外,其他阶段都是垃圾回收线程在执行,也就是会stp,所以题目还是要自己理解才行)
25.说一下springboot的特性,你觉得你在使用的时候给你带来哪些便利
答:约定大于配置,相比于传统的ssm框架,使用springboot会减少很多配置工作,这些配置springboot都已经自动帮我们配置好了
26.说一说依赖注入
答:在不用spring框架的时候,类与类、方法和方法之间的耦合度是很高的,而且要我们自己去维护它们之间的依赖关系,而有了spring框架,我们只需要关注这些资源是否存在,而不用过多的去关注它们之间的依赖性
27.说一说ioc容器的初始化过程
答:(这个一开始没回答上来,然后面试官问ioc容器用了哪些机制,我答了个反射,面试官说只有反射还不行吧,然后我又说了有个工厂模式,后来面试官说确实是有...感觉这个问题没有回答到点子上)
28.说一下Java里面的单例模式是怎么实现的
答:volatile关键字加上synchronized关键字
29.说一下这两个关键字的作用
答:volatile关键字是用来解决可见性的,被volatile修饰的变量,在线程操作它的时候每次都会去共享内存里面去修改它的值,这样对其他线程是可见的(其实还有一个有序性的问题,但是当时没想起来),synchronized关键字是解决多个线程之间并发冲突的一个问题
30.用Java写一下快排的核心代码
答:(前一天晚上刚好看了快排的实现,所以看到这个问题真的是差点笑出声来,5分钟不到就写完了)
31.反问
问了些部门的业务,工作时间制,主要用到什么语言,以及以后的学习建议之类的问题
总结
一面大概持续了40分钟,其中面试官问问题大概30分钟,做题加反问大概10分钟。一面的问题大都比较基础比较简单,遇到不会的面试官也没有深入问下去,面试体验感觉比较好,一面完立马约了二面二面
二面的面试官一看就很不简单,为什么说他不简单呢,主要从他的发量上就能看出来(发际线已经快到头顶了)1.说一下osi七层模型
答:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
1.ping命令用过吗,说一下它是什么协议
答:ping命令时基于ICMP写协议的
2.ping命令用在哪一层
答:用在网络层
3.说一说网络层的功能
答:通过路由寻址协议找到合适的下一个合适的ip地址
4.具体是怎么找到下一个合适的ip地址的呢
答:(不清楚)
5.mysql联合索引是什么
答:(上面问过了)
6.如果B+树的根节点关键字满了,这时我再插入一个关键字,如何分裂
答:选择根节点中间的那个关键字,向上分裂作为新的根节点,然后两个指针分别指向原来左边的关键字和右边的关键字
7.linux如何创建一个子进程
答:fork函数
8.子进程享有父进程的哪些资源,如果父进程有一个文件,子进程可以访问到吗
答:(这里我不清楚,于是说了进程间通信方式有一个管道,觉得应该可以)
9.除了管道,还有哪些进程通信方式
答:消息队列、信号量、共享内存
10.共享内存如何开辟
答:不清楚(不是直接系统开辟的吗......)
11.面向过程和面向对象的区别
答:面向过程比面向对象性能高,但是面向对象有封装、继承、多态的特性,所以更容易维护和扩展,程序之间的耦合度没那么高
12.耦合有哪些类型
答:记不起来了(考研的时候还背过,但是复习的时候没有复习到,后来查了下有七种:内容耦合、公共耦合、外部耦合、控制耦合、标记耦合、数据耦合、非直接耦合)
13.数组里面找前k个最小的元素,有哪些实现方式
答:(经典的TOPK问题,前天晚上刚复习了一遍)最主要的就是堆和快速选择算法,(后面面试官又问了一些细节上的问题,这里给出原题地址:https://leetcode-cn.com/problems/zui-xiao-de-kge-shu-lcof/)
全部评论
(3) 回帖