四面快手、终拿Offer,想告诉你的一些事情

本篇面经来自于群里粉丝朋友的分享,但愿对你有所帮助!面试

快手高开及以上职级面试 是没有笔试或者机试的,因此从第一轮开始就是直接面对面试官。算法

一轮

主要考察对Java基础的理解和深刻程度。数组

  • Spring 原理,Spring IOC、AOP。

这个问题 最好能够多说一点,好比 对于IOC,不妨把Bean 如何加载、如何初始化以及如何注册到IOC容器中的详细过程说一下, 涉及BeanDefinition、BeanFactory也深刻细节聊一下。安全

  • 一个请求过来在Spring中发生了哪些事情。

这个问题不妨把一个请求过来 在TCP层面上创建链接、操做系统如何处理链接、Web容器器接收到链接对象后作了哪些事情、Spring 如何对接收到的请求进行处理都说一下,固然最终仍是 落在Spring 容器内部如何处理一个请求,这个过程必定要说清楚,须要体现细节。在说前面的内容的时候,能够放心面试官不会打断你。数据结构

  • 手写一个栈,实现 push,pop方法,以及 max(获取最大的元素)方法,要求时间复杂度为 O(1)。

这是一个考察数据结构的问题,一方面须要候选人对数据结构有所了了解,一方面也须要候选人对代码有驾驭能力(毕竟要手写代码)。面试官会给必定的时间,在这段时间里面试官不会打扰你,并尽量为你提供方便,好比签字笔不好用面试官会帮你更换。据我我的经验,凡是面对须要写代码的问题,都不要急着放弃,静下心来,仔细思考,都是能够写得不错的。若是没能写出来,面试官会问你实现思路路,若是你的思路很优化,同样能够过了这道题,可是前提是你的代码不能一行都不写。架构

对于数据结构的考察的话,我建议看一下 jdk中对于 List、Stack、Tree、Set 的实现,好比至少你要知道若是让你实现一个单链表你会如何实现,好比你可能会定义一个Node节点,里面有当前节点的key和value,还有对于下一个节点的引用。若是你对这一块的内容还不是很清楚,能够关注个人公众号:《Java技术zhai》,我以前在上面是有详细分享过的,对于熟悉jdk对于各类数据结构的实现,这道题是很容易易过的。框架

  • JVM内存结构

这个问题须要你能画出JVM内存结构的图,画出方法区、堆、程序计算器器、虚拟机栈、本地方法栈,并说出每个部分具体是什么做用,好比哪些是线程共享的,哪些是线程独享的,哪些地方存放了什么数据,为何会这样存放,哪些虚拟机参数对这些空间大小是有影响的,能够如何配置。这些都比较常规。maven

  • 手写一个单例

这个基本上大多数公司都会考察的。要写一个 基于懒汉式的 双重检测的单例。单例有三个比较关键的点:工具

  1. 私有构造方法,避免外部new出对象;
  2. 保证惟一性;
  3. 提供一个全局访问点;

另外懒汉式双重检测的实现方式有三点须要注意的地方:优化

  1. 全局访问点必须是静态的,外界使用能够经过类直接调用;
  2. 在进入锁以后还须要校验;
  3. 保存单例例对象的私有变量必定要用volatile修饰,这个地方 能够多说一些,好比 volatile防止指令重排序,保证内存可见性(JVM层面 和 CPU层面 能够分别说)。volatile 这个地方能说的东西仍是不少的,基本上能够与面试官再聊二十分钟了。
  • HashMap

对于 HashMap 其实通常高级岗位及以上不再会问这个东西了,一旦问了,确定不是让你只说一下数组+链表的。对于它的实现,不同版本实现方式不同。在jdk1.8以后,HashMap 除了数组+链表以外,引入了红黑树。那么好了,你须要说明对于引入了红黑树的 HashMap 如何put一个元素,以及链表是在什么时候转化为红黑树的。好比首先须要知道这个元素落在哪个数组里,获取hashcode后并不是对数组长度取余来肯定的,而是高低位异或求与来获得的。这个地方首先得知道 异或、与是作什么样的运算的,而后说一下在HashMap中的实现,好比hashcode 无符号右移16位后和原hashcode 作异或运算,这至关于把hashcode的高16位拿过来 和 hashcode的 低16位 作异或运算,由于无符号右移后 前面高16位都补零,这就是前面说的 "高低位异或“,进而是 ”求与“,和谁求与呢,和 数组长度减1 求与。

说到这里起码可以证实你是看过源码的,接下来讲说你的思考。

好比 咱们知道 对于hashmap 初始化容量决定了数组大小,通常咱们对于数组这个初始容量的设置是有规律的,它应该是 2^n 。这个初始容量的设置影响了HashMap的效率,那又涉及到影响HashMap效率的主要因素,好比初始容量和负载因子。当已用数组达到容量与负载因子的乘积以后会进行一个rehash的过程,这个地方涉及到的 如何rehash 及各类算法若是有时间也是能够说的,没有时间不说也没有关系。回到刚才说的 2^n, 能够说说它为什么是2^n。当咱们说什么东西为什么是这样的时候,咱们通常从两个角度考虑,一个是这样作有什么好处,另外一个是不这样作有什么坏处。咱们刚才说到”求与“这个过程,若是不是 2^n, 会致使较多的哈希碰撞(具体缘由 能够本身分析一下 或者百度一下),这个会影响HashMap的效率。

说完上面这些,既代表你看过源码,又代表你有本身的思考了,固然也能够进一步说说它是在什么条件下以及 如何进行扩容的(若是时间容许,而且面试官也有耐心继续听下去)。对于put操做,这才只是第一步,找到数组的位置,接下来 要看这个位置也没有元素,若是没有,直接放进去就能够,若是有,要看怎么放进去,jdk1.8中 对于HashMap的实现中,是基于Node(链表节点) 和TreeNode(红黑树节点) 的,固然它们继承了Entry。那么 若是数组当前位置已经有了元素,就得知道这个元素 是 链表的节点仍是红黑树的节点,以便便 进一步确认接下来要put的元素 是以链表的方式插入仍是以红黑树的方式插入,这个地方 在源码中 进行了一个类型的判断,若是是链表的节点,就以链表的方式把要put的节点插入到 next为null的节点上,若是是红黑树的节点,就要以红黑树的方式插入一个节点。接下来 其实不是考察的重点,可是也能够说说:

  1. 为什么要引入红黑树;
  2. 如何在红黑树中插入一个节点;

对于这两个问题,首先 引入 红黑树的好处是为了提升查询效率,要说出O(log2(n)),可是 在提升查找效率的同时也在插入的时候更加耗时,那能够说一下为什么更加耗时,天然带出第二个问题,如何在红黑树中插入一个节点,好比当插入一个节点的时候咱们会默认它是红色的(这个地方能够结合红黑树特色说一下咱们为什么默认它是红色的,从黑色高度以及相邻两节点不同为红色入手),插入后若是父节点是黑色的 就不须要动了了,但假如是红色的,就须要进行左旋和右旋操做,若是很了解,能够细说左旋右旋如何实现,若是不不是很了了解,到此为止也ok。

说到这里,咱们忽略略了一个重要的点,就是链表转换为红黑树的条件,说出 链表长度到8(至关于红黑树开始第四层) 以及 数组大小达到64 就已经够了了,也能够进一步说一下 链表是如何转换为红黑树的。说完也能够说一下 ConcurrentHashMap中也是同样的,而后接下来就引入对ConcurrentHashMap的理解,好比在什么地方会涉及到线程安全问题以及ConcurrentHashMap是如何解决的,说说CAS,说完CAS再说说AQS,自由发挥吧。

  • JVM四种引用类型

这个问题比较简单,强引用、弱引用、软引用、虚引用,说一下它们各自的特色和GC对它们的不同处理方式,再说一下常见的应用场景 或者 jdk的实现中对它们的使用,好比 ThreadLocal 的静态内部类 ThreadLocalMap,它的Key是弱引用的,也能够说一下 在你的理解中 为何它是弱引用的,假如不是 会怎么样。

  • SpringBoot 启动过程

这个主要是从它基于Spring的事件发布和监听机制开始提及 就没什么问题。

二轮

继续考察Java基础,和对应用技术的掌握,好比过往项目中所用的一些框架,在这一轮中会被问到。

  • 类加载过程

加载 连接 初始化,连接又分为验证准备和解析,每个阶段 是作了什么 要说清楚。

  • Object a = new Object(); 这行代码作了了哪些事情,须要从类加载开始提及,这个至关于上面问题的延续,因此 必定要清楚 每个环节 作了哪些事情的,不然这个问题不可能说清楚。说完类加载的过程 再说一下 开辟内存空间、初始化内存空间以及把内存地址赋值给变量a,接下来能够进一步说一下JVM 或者CPU层面对指令的优化,以及在某些时刻咱们须要避免它作这样的优化,好比在单例中咱们的实例须要用volatile修饰 避免指令重排序(能够说一下 在new一个对象的过程当中若是指令重排序了会致使什么结果)。
  • 接下来主要是对过往项目中用到的框架、工具的考察
  1. maven的熟练程度,好比问问 <scope> 有哪些类型
  2. Linux命令行的熟练程度,好比 问问 ${} 和 $() 区别
  3. 消息队列列的熟练程度,好比问问Kafka分区,如何分区等等(由于我过往项目经验中写了kafka,因此才会被问及,若是写了其余消息队列,也可能会被问及)
  4. Netty,从NIO开始说 确定是没错的,再说说Netty的实现方式,以及它除了IO以外还干了哪些事情。

三轮

这一轮主要考察对于过往项目的业务理解

  • 根据过往项目经验 依次介绍业务

这就须要 在面试以前 把本身的作过的项目好好总结一下,它们主要作的业务是什么,解决了什么问题,架构是什么样的,以及你在其中作了哪些工做。这个地方必定要准备充分,至少要能扛得住面试官三连问。不然会被认为 你不太清楚大家以前作的究竟是什么,那你在业务能力方面 多是不太match的。

  • 你有什什么问题想问面试官的

这个地方因人而异,但不管怎样,都不要什么都不问,至少你要表现一点对于岗位的兴趣吧。

好比问一下 公司业务,团队构成,技术栈,以及你所应聘的这个岗位大概作哪些工做

四轮

HR面试。这一轮能够说是斗智斗勇的一个环节,会考察一些软技能、我的成长、职业素质,也会问一下指望薪资。

本次快手面经分享完毕,以为有收获的朋友能够帮我点个关注与转发!

若是你也想进群和你们交流或者想要获取更多面经信息,能够关注右侧的公众号二维码或者直接点击连接加入。

赠人玫瑰,手有余香,我是不那么正经的技术zhai,欢迎你的关注~

相关文章
相关标签/搜索