快手20230807提前批一面

Q and A

面试官:你是专硕还是学硕,能不能让实习?研究方向?

面试官:项目基于什么背景做的?
xxx

面试官:介绍一下框架。
xxxx

面试官:里面中用了什么技术
首先的话,服务层使用了springboot,并且使用了mp,持久化使用了mysql数据库,执行层在占据任务的时候,考虑到多个执行层会完成任务的抢占,使用了redis作为分布式锁,在占据完任务后,使用了线程池完成任务的处理。

面试官:框架如何使用?
xxxx

面试官:你考虑引入了mq和分表优化,引入消息队列是做什么用的?
引入消息队列主要就是将执行层中占据任务和执行任务这两个操作进行解耦,
具体而言就是将拉取的任务都丢进到消息队列里,分发到worker中,worker自己执行自己的任务。

面试官:Java基础知识,平时用的都是java对吧?java中有HashMap,简单介绍一些结构吧?
HashMap的话1.7之前使用的数组+链表进行实现,出现Hash冲突的时候使用头插法,但是头插法容易出现链表成环的问题,以及使用链表进行查找的时候,时间复杂度为O(n)的,因此在jdk1.8的时候,使用了数组链表+红黑树来实现,同时将链表中的头插法更改为尾插法,解决链表成环的问题。红黑树的引入主要就是当链表中的元素超过8的时候,并且数组大小超过64的时候会将链表树化。以上就是我的理解。

面试官:数组链表放在哪个位置上?(主要考察的就是put过程)
首先计算Key的hashCode与高16位右移异或值,然后会判断是否完成初始化,如果没有的话,则初始化,接下来使用了与运算替换了hash模数组大小,(主要的原因就是计算的速度快,以及使得散列表更散列),找到对应的位置,如果为空,则插入,如果不为空,判断当前的值是否与之前的hashCode值相同,相同则替换,否则判断通的节点类型是否为红黑树,如果是的话完成替换或者插入,如果不是红黑树的话,向链表进行插入。后续可能会判断是否需要扩容!

面试官:HashMap是线程安全的么?
不是线程安全的,主要就是在多线程操作的时候,会出现数据的覆盖或者丢失。主要的替换方案就是ConcurrentHashMap

面试官:ConcurrentHashMap如何保证线程安全的呢?
这个的话,在jdk1.7前使用的分段锁来实现的,具体而言就是使用了一个Segment数组,数组大小默认为16个,每个桶中使用ReentrantLock进行加锁和解锁。也就是多线程在操作同一个桶的时候,会进行加锁,其他线程处于自旋或者阻塞的状态。这个存在一个问题,就是并发的个数会受到数组的大小的影响。
而在Jdk1.8的时候使用了数组链表红黑树,对于每个数组bin的话,他使用了cas和synchronzied进行加锁。具体而言就是先判断插入到哪个位置,使用cas进行加锁,加锁失败可能出现这个扩容,再插入的时候使用sychronzied进行插入和覆盖。然后先判断当前节点是否为链表,完成插入或者覆盖的操作,如果非链表的话,即为红黑树,则完成这个数据的插入和覆盖。

面试官:线程池了解过么?我们在java里面创建一个线程池都需要指定哪些参数?
7个参数:核心,最大线程数量,存活时间,单位,阻塞队列,线程工厂,拒绝策略(DiscardOlddestPolicy)。

面试官:每个参数有什么用?
可以从一个例子来讲么?我自己编了一个小例子。
这个核心线程数量就相当于前锋,来任务了,我就先处理。
阻塞队列相当于中锋,不处理任务,存任务。
最大线程数量相当于后卫,前锋不够,后卫来补。
拒绝策略相当于守门员,都不行,我就要拒绝了
线程工厂相当于球员工厂,创建球员的。
存活时间相当于前锋+后卫空闲的时候,什么时候休息。
单位的话就是隔多久休息。

面试官:为什么是先放到队列里,而非创建线程去处理?
队列的话,我觉得相当于缓存吧?如果每来个任务,我就需要创建线程,这样性能肯定受到损失,充分的利用Cpu。

面试官:线程有几种状态。
6种状态:创建,执行,终止,阻塞,等待,超时等待。

面试官:线程池的问题,如果线程池当前处于空闲的状态,核心线程数量是不会被销毁的,那这几个核心线程处于什么状态?为什么处于这个状态?
当线程池处于空闲状态时,核心线程数量是不会被销毁的。这些核心线程通常处于等待(Waiting)或阻塞(Blocked)状态,特别是它们在等待新任务的到来。

面试官:讲一下JVM内存的结构,哪些是共享的,哪些是线程不共享的?
堆、栈、方法区、程序计数器、本地方法栈。共享的有堆,方法区。不共享的是本地方法栈,栈,程序计数器。

面试官:了解过垃圾回收相关的么?垃圾回收算法看过么?
标记清除,标记整理,标记复制,分代收集算法。

面试官:如何判断一个对象是否能回收?
引用计数法,可达性分析算法。
引用计数法存在循环引用问题,就是A引用B,B引用A。这样AB都不会回收。

面试官:GC ROOT都有什么?
Static Final修饰的对象,以及线程,栈中的对象引用。

面试官:数据库比较熟悉mysql吧?简单介绍一些索引的结构。(存在问题,需要再看看)
使用b+树构建索引,如果是聚簇索引的话,叶子结点存储的是一行所有的信息,如果非聚簇的话,存储的是聚簇索引+非聚簇的?节点与节点通过链表进行连接,因此可以支持范围查询。

面试官:数据存储在叶子结点有什么好处?(存在问题)
主要的好处就是通过非叶子结点能够定位到叶子结点,速度快,并且避免频繁的回表,

面试官:b树存储在所有的结点上,如果存在查询的数据都在第一层,而b+树存储在叶子结点那层。
这只是个例外,有其他的情况,如果出现其他情况,每次都是一次IO

面试官:提到了聚簇索引?他是什么样的?非聚簇索引(存在问题)
根据主键构建的索引

面试官:联合索引,比方有好几个列建立的索引,为何需要遵循最左匹配规则?(存在问题)
主要的原因就是能

面试官:给你几个sql题,比方说有个表,对a,b,c建立索引(明天看看)
1.select a,b, from tb where a=1 and b=2
2.select b,c,a from tb where a=1 and b=2 and c=2
3.select b,c from tb where b=1 and c=2 回答错了
4.select b,c from tb where a>2 and b=3 回答错了

面试官:看你了解过redis?会给redis的key设置一个过期时间,如果过期了,如果处理这个对象?
会有删除策略:定时删除,定期删除,惰性删除。

面试官:写个算法题,二叉树的右侧视图。
一开始想前中后遍历,后来使用层序遍历获取,根据层序遍历写了出来。

感悟:相较于暑期实习面试算法写不出来,有一些提升,继续努力💪

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值