快手的面经【面试准备】
2025-04-01 12:00   15

前言

2023-7-26 08:57:44

私密发布于
2023-11-15 21:11:22

公开发布于
2024-5-21 13:11:46

以下内容源自《【面试准备】》
仅供学习交流使用

版权

禁止其他平台发布时删除以下此话
本文首次发布于CSDN平台
作者是CSDN@日星月云
博客主页是https://blog.csdn.net/qq_51625007
禁止其他平台发布时删除以上此话

快手的面经

来源于牛客搜索:
快手面经java

秋招快手面经

原贴: 秋招快手面经

一、自我介绍

二、针对项目提问
提问实习做的一部分,大概十几分钟

三、八股
1、讲一下HashMap

数据结构:7之前是数组+链表 8之后是数组+链表+红黑树
容量规定是2的幂次方
默认容量:16 
加载因子:0.75f
阈值:容量*加载因子
size到阈值的时候:扩容2倍

2、扩容为什么是2倍的

保证容量是2的幂次方
计算槽位:使用hash&(n-1)方便

3、重写equals为什么要重写hashcode

在HashSet或者HashMap中
对不可重复的数据进行判断
为了减少对equals的调用,所以使用了hashcode计算
Hashcode一样,equals不一定一样
equals一样,hashCode一定一样

4、什么时候用到hashcode

Map的hash函数中有一个
hashCode高16异或低16来计算hash值,减少hash冲突
put加入的时候
调用putVal()

5、让你设计线程池,你会怎么设计,有哪些参数

核心线程树
最大线程树
空闲线程最大存活时间
存活时间单位
等待队列
拒绝策略
线程工厂

平心而论,八股问得不多且简单

四、代码考核
1、自己实现一个简单的线程池
无需写拒绝策略,实现向线程池放入任务,和阻塞队列
2、给定有序数组和一个target,数组无重复元素,找到数组中小于target的最大值
思路:先用二分找到大于等于target的下标,返回下标-1位置的元素,即是答案
3、给一个m*n的矩阵,给定k个点(x,y),求出矩阵中每个点到k个点的最短的曼哈顿距离
思路:先把k个点的最短距离存为0,然后用bfs广搜相邻的四个点,相邻的四个点的最短距离就是1,然后把最短距离为1的入队,依次bfs下去

快手–Java开发一面面经

原贴: 快手–Java开发一面面经

1: String的特性,不可变的好处,怎么实现不可变的

特性:不可变性

好处:1.易于实现字符串常量池 2.多线程安全(常用作密码)

1.类本身是final修饰的
public final class String
2.数组也是final修饰的 private 修饰的
private final char value[];

3.整个类没有提供任何一个修改数组内容,以及返回数组引用的方法

2:为什有了string还要StringBuffer,和string的区别,性能比较

StringBuffer的底层数组是可变的
较高性能的,加了synchronized同步互斥:线程安全

https://blog.csdn.net/weixin_47252176/article/details/118721654

3: Thread Local的原理,为什么Thread Local会有内存泄露问题,如何解决的?


https://blog.csdn.net/qq_43116031/article/details/129402104

ThreadLocal是Java中的一个线程本地变量,它可以在多线程的情况下为每个线程维护一个独立的变量副本,不同线程之间互不干扰。ThreadLocal使用一个Map来存储每个线程的变量副本,Map的key是线程本身,value是线程对应的变量副本。

ThreadLocal的实现原理:
1、每个ThreadLocal对象内部都有一个Map,用于存储每个线程的变量副本,Map的key是ThreadLocal对象本身,value是对应线程的变量副本。
2、在get方法中,先获取当前线程,然后从当前线程对应的Map中获取变量副本,如果不存在则通过initialValue方法初始化一个变量副本并存储到Map中。
3、在set方法中,也是先获取当前线程,然后将变量副本存储到当前线程对应的Map中。
4、在remove方法中,先获取当前线程,然后从当前线程对应的Map中移除变量副本。

ThreadLocal内存泄漏的原因是因为ThreadLocalMap中的Entry没有被及时清理。每个Entry都持有一个对ThreadLocal对象的弱引用,当ThreadLocal对象没有被其他对象强引用时,就会被垃圾回收器回收。但是,Entry中的value却没有被及时清理,导致内存泄漏。

解决ThreadLocal内存泄漏的方法:
1、及时清理Entry中的value,可以在使用ThreadLocal之后手动调用ThreadLocal的remove方法来清理变量副本。
2、使用ThreadLocal的子类InheritableThreadLocal,它会将父线程的变量副本复制一份给子线程使用,可以避免内存泄漏问题。但是,在使用InheritableThreadLocal时,需要注意变量副本的生命周期问题,避免子线程持有过期的变量副本。
3、使用弱引用或者软引用来解决内存泄漏问题。可以通过自定义ThreadLocal来实现。比如,可以定义一个WeakThreadLocal类,它使用弱引用来存储变量副本,并在Entry被垃圾回收时自动清理变量副本。


4:hashmap插入过程,concurrenthashmap的优化,1.7和1.8的区别

put
putVal
数组是否初始化,
没有初始化就先初始化,resize() sizeCtrl控制
计算槽位,
如果是没有值,直接插入
判断首节点是否相同,替换
如果是树,就树的插入
否则就是链表插入,如果有相同对象就替换,返回旧值,插入之后需要判断是否要进行树化操作
判断++size是否大于扩充阈值:扩容
插入成功返回null
ConcurrentHashMap 1.7与1.8的区别
https://blog.csdn.net/b1303110335/article/details/118571815
1.7:锁的粒度:Segment:段锁
1.8:锁的粒度:一个槽位:结点锁

1.锁结构不同
在JDK1.7中,ConcurrentHashMap基于Segment+HashEntry数组实现的。Segment是Reentrant的子类,而其内部也维护了一个Entry数组,这个Entry数组和HashMap中的Entry数组是一样的。所以说Segment其实是一个锁,可以锁住一段哈希表结构,而ConcurrentHashMap中维护了一个Segment数组,所以是基于分段锁实现的。 而JDK1.8中,ConcurrentHashMap摒弃了Segment,而是采用synchronized+CAS+红黑树来实现的。锁的粒度也从段锁缩小为结点锁.

5: 为什么tomcat要打破双亲委派机制?

https://developer.aliyun.com/article/1081332
Tomcat打破双亲委派机制的目的其实很简单,我们知道web容器可能是需要部署多个应用程序的,这在早期的部署架构中也经常见到,如上图。但是假设不同的应用程序可能会同时依赖第三方类库的不同版本。我们通过上文在了解类加载机制的时候知道它是要确保唯一性的,但是总不能要求同一个类库在web容器中只有一份吧?所以Tomcat就需要保证每个应用程序的类库都是相互隔离并独立的,这也是它为什么打破双亲委派机制的主要目的。

6: 四种引用类型,以及各自的应用场景

https://blog.csdn.net/m0_46672151/article/details/122609831
强:JVM不会回收 对象
软:堆内存不够,是回收
弱:一次gc回收
虚:收集器回收是得到系统通知

应用场景:
90%的情况下我们使用的是强引用,在缓存的时候用到软引用和弱引用,在需要告知对象被GC回收时采用虚引用。

7:G1的原理及流程

分代回收,但是region划分
初始标记
并发标记
最终标记
筛选回收
https://blog.csdn.net/qq_33522097/article/details/126478466

8: mysql索引种类,聚簇索引和非聚簇索引的区别

聚簇索引:索引的叶子结点保存完整的数据记录
非聚簇索引:索引的叶子结点保存数据所在地址

9:mysql的四种隔离级别,解决哪些问题,mvcc的实现原理

SQL标准
读未提交	脏写
读已提交 脏读
可重复读 不可重复读 InnoDB中利用MVCC解决了幻读
串行化 幻读
undo log版本链
隐藏字段 tx_id 回滚指针
ReadView creator_trx_id trx_ids up_limit_id low_limit_id 

10: mysql死锁及应用场景

占1求2 占2求1
超时回滚
死锁检测

11: Redis的基本数据结构,哨兵如何实现通信,结点宕机如何处理

https://blog.csdn.net/ZXMSH/article/details/125461450
string:int row embtr 
list:ziplist quicklist
hash:hashtable
set:dict
zset:skiplilst
https://blog.csdn.net/qian_348840260/article/details/114641898

12: Spring Boot的自动装配流程

https://blog.csdn.net/weixin_50519232/article/details/126753338
@SpringBootApplication
@SpringBootConfiguration
作用:标记这个类是一个Springboot的配置类。

@ComponentScan
作用:自动扫描包(扫描当前主启动类同级的包)并加载符合条件的组件或者bean,将这个bean定义加载到IOC容器中。

@EnableAutoConfiguration
作用:开启自动配置功能


13:Spring Bean的安全问题

https://blog.csdn.net/2201_75630288/article/details/129646164

14: Spring如何解决循环依赖问题

https://blog.csdn.net/m0_46420244/article/details/126215891
一级缓存: singletonObjects存储的是所有创建好了的单例Bean
二级缓存:earlySingletonObjects完成实例化,但是还未进行属性注入及初始化的对象
三级缓存:singletonFactories提前暴露的一个单例工厂,二级缓存中存储的就是从这个工厂中获取到的对象。

15:MyBatis的分页是内存分页还是物理分页,分页插件的实现原理

https://blog.csdn.net/kouguoguo/article/details/128340915

16: MyBatis的sql执行原理(核心是代理)

https://blog.csdn.net/kouguoguo/article/details/128340915

17:MyBatis Plus有哪些增强

https://blog.csdn.net/qq_45656077/article/details/129923785

18: 编程题:任意两个结点的最近公共祖先

https://blog.csdn.net/ChineseSoftware/article/details/123734932

快手社招Java后端2年面经

原贴: 快手社招Java后端2年面经

快手 交易中心Java后端开发一面面经

原贴: 快手 交易中心Java后端开发一面面经

1.自我介绍
2.科研里数据包聚合项目讲一下
是不是基于TCP/IP协议栈的
3.讲一下TCP的四次挥手 timewait了解吗

A与B
A发送FIN包,进入FIN-WAIT-1状态
B收到之后,B发送ACK,进入CLOSE-WAIT状态
A收到,进入FIN-WAIT-2状态
B发送FIN包,进入LAST-ACK状态
A收到,发送ACK,进入TIME-WAIT状态,等待2MSL,无消息进入CLOSE状态
B收到,进入CLOSE状态

保活计时器:没收到一个数据,就重新计时;当客户端意外故障关闭了,在2小时之后发送10个探测报文,没有响应就关闭连接

4.Java线程池 参数有哪些

核心线程数
最大线程数
空闲线程最大存活时间
存活时间单位
等待队列
拒绝策略
线程工厂

5.Java锁 synchronized是可重入的嘛?哪个锁是可重入的?

是可重入的
ReentrantLock

6.mysql常见的引擎有哪些?innodb的数据结构?B和B+树的区别

MyISAM InnoDB
B树和B+树的区别
B+树的数据只存储在叶子结点,B数的话还存储在内部结点

7.隔离机制有哪些?哪个是mysql默认的?

读未提交
读已提交
可重复读
串行化

8.什么是幻读?可重复读有没有解决幻读?哪个隔离机制解决了?

当事务A查询记录之后
事务B添加记录
再当事务A查询记录,发现结果集变多了,出现了幻影记录

串行化
可重复读+MVCC

9.可重复读是怎么实现的

MVCC
undo log版本链
隐藏字段 tx_id roll_pointer
ReadView create_tx_id tx_ids up_limit_id low_limit_id
可重复读会在事务查询的时候复用第一次的ReadView

10.Java反射 C和C++能不能实现反射?Java的类加载

静态语言和动态语言
Java:准动态语言

双亲委派

算法题
有序链表转换成二叉搜索树(代码写出来了但运行报错)

快手 暑期实习 面经

原贴: 快手 暑期实习 面经

快手java一面面经

原贴: 快手java一面面经

快手Java开发岗一面面经

原贴: 快手Java开发岗一面面经

快手Java日常实习一面

原贴: 快手Java日常实习一面

快手java暑期实习二面面经

原贴: 快手java暑期实习二面面经

快手JAVA后端暑期一面二面面经(offer版

原贴: 快手JAVA后端暑期一面二面面经(offer版

快手JAVA一年社招面经

原贴: 快手JAVA一年社招面经

23届正式批快手面经-Java工程师

原贴: 23届正式批快手面经-Java工程师

1,做题:螺旋数组变种题
2,实习介绍,遇到的最大的挑战,慢接口优化是怎么实现的等等

3,Mysql:
介绍一下索引
mysql的隔离级别,是通过什么实现的
mvcc的实现原理
mysql的锁机制,乐观锁和悲观锁分别在什么场景下使用,乐观锁可以怎样实现

读多写少 写多读少
版本号与CAS算法

4,计算机网络:
TCP/IP五层协议,每一层分别有哪些协议
用户输入URL到显示的全过程,越详细越好

ARP协议是做什么的
HTTP的请求方法有哪些
5,操作系统:
I/O多路复用,epoll
6,redis:
redis有哪些数据类型,各自的底层原理
如果要自己实现zset,可以用哪些数据结构(hashset+跳表)
7,java:
Java有哪些锁,synchronized和reentrantlock的区别

语法层面
对象头 Mark Word

API层面
AQS

可重入的
对synchronize的优化
起初设计是重量级锁
无锁、偏向锁、轻量级锁、重量级锁

Lock的功能扩展
中断可响应
公平锁与非公平锁
锁绑定多个条件

快手一面面经(JAVA)

原贴: 快手一面面经(JAVA)

快手 一面

快手 一面

1)java 异常 空指针异常属于哪种异常

RuntimeException

2)java数据类型有哪些 int 的范围 string属于基本数据类型吗

基本数据类型:boolean short int long float double char byte
引用数据类型:Object及其子类、数组
int 4字节大小 321为符号位 所以范围:-2^31~2^31-1

3) arraylist与 linkedlist区别 add方法查询复杂度

底层:可扩容数组 双向链表
默认容量:10,扩容1.5倍
add:O(1)	O(n)

4)hashmap1.8底层结构,put方法流程,什么情况下需要扩容,为什么要把链表转换为红黑树,红黑树查询效率

数组+链表+红黑树
底层调用putval()
首先看数组是否初始化,没有初始化,调用resize
然后计算槽位 &(容量为2的幂次方),如果为空,直接放入
有值的,遍历,判断时候为树,树的put
链表的put,遍历每一个K,判断是否相等,替换,直到尾部,添加
判断是否需要达到树化条件8 64
最后++size与阈值(容量*负载因子0.75f)比较,是否扩容
扩容调用resize方法
原理就是高低链,hash&oldCap==0
对树的操作,按链表操作,然后再进行判断是否树化8,以及退化6
把容量变为2倍,阈值变为28是泊松分布统计的
O(n) O(log2(n))

5)hashmap具体是怎么通过key计算数组索引的

i=(n-1)&hash
hash(key)		
h=key.hashCode()^h>>>16

6)线程池的核心参数,添加任务原理,饱和策略有哪几种,说一下keepalive的含义,线程池是如何让非核心线程在达到心跳时间后消亡的

7大核心参数:核心线程数 最大线程数 空闲线程的存活时间 时间单位 阻塞队列 线程工厂 拒绝策略
四种拒绝策略:抛异常,丢弃,返回给调用者,逐出旧线程

7)中止线程的四种方式,interrupt方法在线程执行任务过程中,还能使用吗


8)redis数据类型 hyperloglog bitmap geo,的具体应用场景

string list hash set zset
统计UV,用户流览量
统计DAV,日活用户
附近的人

9) zset 原理和扩容机制,为什么要把ziplist转化为跳表

10)threadlocal具体实现原理,可能存在什么问题

多线程每一个线程有他自己的资源,不需要共享
ThreadLocalMap key弱引用
线程->ThreadLM <K<V>
会有V的内存泄漏问题

11)volatile 原理,功能,如何保证禁止重排序,volatile i++,为什么不能保证原子性

i++包含3CPU原子操作
取 + 写
getstatic iadd putstatic

12)数据库四种隔离级别,分别可能会存在哪些问题,什么是幻读脏读不可重复读

读未提交 读已提交 可重复读 串行化
丢失更新 脏读 不可重复读 幻读

13)数据库怎么实现可重复读?Mvcc原理 ?

读快照
undo log版本链
行的隐藏字段 tx_id roll_pointer
ReadView c_id tx_ids low_limit_id up_limit_id
可重复读是在事务开启式,第一次就生成ReadView 后面每一次查询都复用该ReadView

14)什么是聚簇索引?什么是非聚簇索引?什么是覆盖索引?什么是回表查询?

叶子结点:存储完整的一行记录
存储位置

在二级索引查询的时候,查询字段被包含在索引字段中,不需要回表查询
辅助索引,查不到select的列,需要去主键索引中查询

15)Spring框架涉及到哪些设计模式?

单例模式
原型模式
工厂模式
代理模式

16)静态代理和动态代理

编译时在字节码中增强功能
运行时增强功能

17)状态码301和302

永久重定向
临时重定向

2023-8-1 16:10:50

快手 秋招 Java 一二面(凉经 已自闭)

快手 秋招 Java 一二面(凉经 已自闭)

写到另一篇中了
快手 秋招 Java 一二面(凉经 已自闭)【面试准备】

最后

我们都有光明的未来

祝大家考研上岸
祝大家工作顺利
祝大家得偿所愿
祝大家如愿以偿
点赞收藏关注哦