2020年9月22日更新 滴滴一面二面三面面经Base杭州 需要的同学移步https://www.nowcoder.com/discuss/520986
字节跳动一面
Base杭州 游戏业务 Java开发岗位 面试时间约80分钟
本科研究生课程,没学过计算机网络、计算机组成、操作系统吗
硕士为什么不选择科班,为什么选择互联网公司
数据库掌握多少
SVN
和Git的区别,fetch和pull的区别
有冲突的时候需要怎么解决
介绍一下Docker,Docker和操作系统映射的关系
虚拟机和当前物理机的关系,操作系统层面,什么关系?包含(没听清)
什么数据用MySQL
数据库,什么数据放在Redis
中,项目中实际遇到的举例
项目中最经常用到的Redis
数据类型
为什么rua
脚本能保证原子性
Nginx
动静分离的介绍,了解CDN
吗
缓存击穿,缓存一致性
Redis
中数据的脏读问题,如两个不同的线程先后往数据库中写数据,再往Redis
中写数据,但是第二个线程先往Redis
中写了,第一个线程又去修改了Redis
中的数据,造成了MySQL
和Redis
中的数据不一致,如何解决?不使用锁如何解决?
读不需要变化,写数据情况下,每次删除Redis
中的数据
分布式事务在项目中用什么实现的
解释一下令牌保证接口幂等性(面试官以为令牌是实现了多点登录功能,用于认证中心)
令牌生成的逻辑
在秒杀系统中使用信号量的原因
消息队列在业务中使用场景
项目中JVM
调优介绍
JVM
中的垃圾回收器介绍,了解Jstack
不
计算机网络分层以及对应的协议,为什么分层
为什么TCP需要四次挥手
看你笔试用了StringBuffer
,谈谈它和Cache
的区别(计算机组成中的Cache概念)
Java学习路线
JVM
中的垃圾回收算法,为什么不同代用不同算法
新生代标记的是什么对象,老年代标记的是什么对象
学习使用的数据库版本,学了哪些知识
MySQL5.7
在快照和next-key保证下能避免幻读问题
MySQL
索引,InnoDB
用的是什么索引,为什么B+树能提高查询性能
磁盘读取的顺序啥的(操作系统还是计算机组成的知识?)顺序读的问题
Redis
容灾备份,持久化的实现
设计方法保证Redis
宕机时刚要存的数据也能持久化,不搭建集群主从复制
MySQL
的同步(持久化)如何实现
AOF
恢复和RDB
恢复数据有什么区别,优劣
锁的优化,升级,AQS
读写锁在AQS
中和其他锁最大的区别
反问了解下字节的考核制度(面试官说字节基于对伙伴充分的信任,分配任务之后不会限定deadline,考核也有成熟的制度体系)
字节跳动二面
面试时间约70分钟
自我介绍
Spring中为什么默认是单例
说说单例和原型各自的优缺点
手写三个线程安全的懒汉型单例模式
写的过程中让解释了static、锁、锁的粒度一些知识
让介绍synchronized和reentrantlock各自适用的场景(没太多开发经验,我只说了两者的一些区别)
手写一个对外提供put、get、remove的hashmap,用数组和链表实现,不需要写hash算法
就是这两道手撕代码题让人绝望,在网页手敲还犯了很多低级错误,比如volatile的拼写和括号的对齐等,面完心里自己也差不多有数,就问面试官手撕代码的能力如何得到提升,面试官建议让多写就行了。
全程除了一开始问Spring中为什么默认单例的问题之外,基本就是一边写代码一边问问题,不难发现一面考察主要是技术面的宽度,二面主要考察技术的深度。但是一面的时候面试官也开始就坦言和我说不要有太多压力,我这边就是会问到你不会为止。
总的来说字节两次面试,面试官的能力都很过硬,态度也很好,会引导会沟通,是自己能力不够,校招机会用完了,简历被深圳的HR捞起来了,重新参加了笔试,希望能再捞我一次。
美团一面
Base北京 约40分钟
自我介绍
实习经历介绍
项目介绍,反问了项目中的难点在什么地方
回答提到了数据库IO的瓶颈,引入Redis技术,面试官就问数据库IO的IPS是多少
这里有点懵因为单机没做过压测,面试官这里有点质疑项目的真实性,追问每次IO的数据量有多大
(最后反问环节问面试官的反馈,面试官也直接说了直接说为了学习Redis使用这门技术也挺好的,没必要刻意说为了解决数据库IO存在的问题引入Redis,你提了数据库瓶颈那你得了解具体的瓶颈,不然就是减分项了)
Redis和数据库并发一致性问题
Redis加分布式锁解决缓存雪崩的问题时存在的问题
如何保证Redis加锁和解锁都具有原子性
聊数据库三范式
索引、聚簇索引、辅助索引、覆盖索引
解释一下丢失修改、脏读、不可重复读、幻读具体什么并发竞争下发生的问题
上述并发一致性如何解决
回到Java的问题上,说一下Java的基础数据类型
String为什么是不可变的
如果对一个String对象频繁的修改,会有什么问题,如何改进
除了转成StringBuffer、StringBuilder还有其他好办法吗
hashmap线程不安全的场景介绍一下
如果让你设计一个线程安全的hashmap你会从哪些角度考虑
线程的生命周期
多线程还问了一些其他题,有点会议不起来了,想到了再更新补上
手撕一个SQL,从一个表中选出所有成绩都大于80分的学生的姓名
任选一个排序算法手撕,直接在网页里写并要求运行,写了个快排
美团二面
约50分钟
自我介绍
询问了一下意向城市、手头的offer和岗位投递情况
实习项目的业务了解,在我描述自己做的工作的时候会提问为什么不用另外的做法,然后会和面试官解释原因,重点介绍自己遇到的一些难点,解决的方法
询问实习时长只有一个半月的原因
个人项目中某个技术的询问,重点是Redis
然后反问环节面试官耐心地就部门业务和新人培养制度给我介绍了十多分钟,真的是很nice了。
有赞
一面
Base杭州 9:30开始一面,11:00左右二面,12:30左右HR面
自我介绍,刷了点小心机,特意提了下很欣赏有赞提倡的enjoy氛围
面试官问是特意了解过有赞吗,就顺水推舟夸了一波
TCP三次握手及各个状态名称
如果是两次会有什么问题
四次挥手的各个状态名称和流程描述
POST和GET的区别
POST的body的大小
Java的类加载器介绍
写过自定义类加载器吗
双亲委派机制
线程的生命周期,各个状态的转换调用什么方法
wait和sleep的区别
实现线程的四种方式
实际使用线程池的场景
线程池的核心参数
让你手写线程池参数需要考虑什么因素(分析了CPU密集还是IO密集,分别什么设计,面试官问还有吗,尴尬地说不清楚其他的了)
volatile的作用及实现原理
ThreadLocal作用、原理、应用场景、存在的内存泄漏问题及解决
Redis持久化方式AOF和RDB的介绍
Redis的事务
索引的存储结构
聚簇索引和非聚簇索引区别、优劣
联合索引、覆盖索引
什么时候适合建索引
什么时候建立了索引但是没有走到,针对单列索引
(查了下就是索引参与函数计算、转型、模糊查询等会索引失效,进行全表扫描)
数据库隔离级别以及分别解决的是什么问题
事务的ACID特性
解释一下一致性
反问环节
二面及HR面
忘了录音了,二面主要针对项目进行深挖,感觉侧重考察技术深度,会了解你发现问题解决问题的能力,而且因为每个人实习经历个人项目千人千样,肯定问的不尽相同,所以参考意义也不是特别大。
HR面主要询问想从事Java开发的原因,为什么读研,读研给你带了最大的提升是什么
这里我说了一个能力之后HR让举一个印象最深的例子来证明你这方面的能力得到了锻炼
然后问到了有压力的时候是怎么调整的,我说了个自己习惯对的放松自己的方式之后,面试官追问说你这样只是暂时放松了自己,可能还是没有解决产生压力的原因,有想过怎么去做吗
因为这是第一次参加HR面(菜鸡本鸡),所以不太熟悉HR面的套路,感觉这次的面试官更喜欢你通过具体的经历、情节、故事、场景来表达或者佐证你说的东西
最后还问了期望薪资,菜鸡没经验直接就说了,后面实验室同学说我说得低了,不知道后续还有没有argue的机会。
面经最后算是一些碎碎念吧,大佬的秋招差不多也都结束了,0offer选手依然是0offer,尤其是还没达到毕业要求(论文没投)的0offer选手来说,压力还是很大的。但没什么好说的,选了这条路硬着头皮也得走下去。秋招参加第一次面试的时候字节的面试官很nice,对我说一个技术的出现必然是为了解决原来技术不能解决的问题的,要带着问题去学习新技术,复习准备面试的时候带着问题去理解面试问题,其实会轻松很多。举个例子
传统HTTP存在以下缺点:
- 通信使用明文,内容可能被监听
- 不验证通信方身份,因此可能遭遇伪装
- 无法验证明报文完整性,有可能遭遇篡改
上述三个缺点分别可以采用加密、认证、完整性保护来解决,HTTPS=HTTP+加密+认证+完整性保护
具体实现:SSL和TSL,其中SSL指SSL3.0,TSL是基于SSL3.0上发展的。通过使用 SSL,HTTPS 具有了加密(防窃听)、认证(防伪装)和完整性保护(防篡改)。
接着来理解HTTP协议的发展历程,随着网页内容的丰富和需要及时更新获得更多资讯的特点,传统的HTTP标准变成了瓶颈,粗体内容为对应造成的问题
- 一条连接上只可发送一个请求 队头阻塞造成高延迟
- 请求只能从客户端开始 不支持服务器推送消息
- 请求响应首部未经压缩就发送 首部信息越多延迟越大
- 明文传输 带来的不安全性
HTTP2.0基于SPDY,在HTTP基础上升级,
- 封装成帧,二进制传输,多个帧之间可以乱序发送,根据帧首部的流标识可以重新组装。
- Header 压缩,"HPACK”算法,在客户端和服务器两端建立“字典”,用索引号表示重复的字符串,还采用哈夫曼编码来压缩整数和字符串
- 多路复用,可以只通过一个 TCP 连接就可以传输所有的请求数据。
- HTTP2还在一定程度上改变了传统的“请求-应答”工作模式,服务器不再是完全被动地响应请求,也可以新建“流”主动向客户端发送消息。
- 提高安全性
但HTTP2.0还是存在缺点:
-
TCP 以及 TCP+TLS建立连接的延时
HTTP/2都是使用TCP协议来传输的,而如果使用HTTPS的话,还需要使用TLS协议进行安全传输,而使用TLS也需要一个握手过程,这样就需要有两个握手延迟过程
-
TCP的队头阻塞并没有彻底解决
HTTP/2中,多个请求是跑在一个TCP管道中。出现丢包时,整个 TCP 都要开始等待重传,那么就会阻塞该TCP连接中的所有请求
对应出现了HTTP3.0,基于 UDP 协议的“QUIC”协议,让HTTP跑在QUIC上而不是TCP上
- 实现了类似TCP的流量控制、传输可靠性的功能。QUIC在UDP的基础之上增加一层来保证数据可靠性传输
- 实现了快速握手功能,QUIC是基于UDP的,所以QUIC可以实现使用0-RTT或者1-RTT来建立连接
- 集成了TLS加密功能,QUIC使用的是TLS1.3,TLS1.3优点之一就是减少了握手所花费的RTT个数
- 多路复用,和TCP不同,QUIC实现了在同一物理连接上可以有多个独立的逻辑数据流
顺着这个思路很容易想清楚HTTPS
和HTTP
的区别、 HTTP
协议的发展历程。触类旁通可以推广到操作系统中的进程通信方式、页面调度算法、IO模型等等。
值得思考的还有“池化”和“缓存”的思想,都有类似相同的特性:预处理和延期销毁,看似很简单的思路但是大大降低了性能损耗,只要多思考就能总结出很多有趣的东西,准备面试的日子压力很大,每天晚上都会看两三集老友记再睡,也很枯燥,每天单调地重复笔试、面试、准备面试、练习笔试,但是只要有心,生活就有值得开心的地方,希望各位都能有满意的offer,共勉,此致。
全部评论
(22) 回帖