四面快手、终拿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内存结构的图,画出方法区、堆、程序计算器器、虚拟机栈、本地方法栈,并说出每一个部分具体是什么作用,比如哪些是线程共享的,哪些是线程独享的,哪些地方存放了什么数据,为什么会这样存放,哪些虚拟机参数对这些空间大小是有影响的,可以如何配置。这些都比较常规。
- 手写一个单例
这个基本上大多数公司都会考察的。要写一个 基于懒汉式的 双重检测的单例。单例有三个比较关键的点:
- 私有构造方法,避免外部new出对象;
- 保证唯一性;
- 提供一个全局访问点;
另外懒汉式双重检测的实现方式有三点需要注意的地方:
- 全局访问点必须是静态的,外界使用可以通过类直接调用;
- 在进入锁之后还需要校验;
- 保存单例例对象的私有变量一定要用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的节点上,如果是红黑树的节点,就要以红黑树的方式插入一个节点。接下来 其实不是考察的重点,但是也可以说说:
- 为什么要引入红黑树;
- 如何在红黑树中插入一个节点;
对于这两个问题,首先 引入 红黑树的好处是为了提高查询效率,要说出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一个对象的过程中如果指令重排序了会导致什么结果)。
- 接下来主要是对过往项目中用到的框架、工具的考察
- maven的熟练程度,比如问问 <scope> 有哪些类型
- Linux命令行的熟练程度,比如 问问 ${} 和 $() 区别
- 消息队列列的熟练程度,比如问问Kafka分区,如何分区等等(因为我过往项目经验中写了kafka,所以才会被问及,如果写了其他消息队列,也可能会被问及)
- Netty,从NIO开始说 肯定是没错的,再说说Netty的实现方式,以及它除了IO之外还干了哪些事情。
三轮
这一轮主要考察对于过往项目的业务理解
- 根据过往项目经验 依次介绍业务
这就需要 在面试之前 把自己的做过的项目好好总结一下,它们主要做的业务是什么,解决了什么问题,架构是什么样的,以及你在其中做了哪些工作。这个地方一定要准备充分,至少要能扛得住面试官三连问。否则会被认为 你不太清楚你们之前做的到底是什么,那你在业务能力方面 可能是不太match的。
- 你有什什么问题想问面试官的
这个地方因人而异,但无论怎样,都不要什么都不问,至少你要表现一点对于岗位的兴趣吧。
比如问一下 公司业务,团队构成,技术栈,以及你所应聘的这个岗位大概做哪些工作
四轮
HR面试。这一轮可以说是斗智斗勇的一个环节,会考察一些软技能、个人成长、职业素质,也会问一下期望薪资。
本次快手面经分享完毕,觉得有收获的朋友可以帮我点个关注与转发!
如果你也想进群和大家交流或者想要获取更多面经信息,可以关注右侧的公众号二维码或者直接点击链接加入。
赠人玫瑰,手有余香,我是不那么正经的技术zhai,欢迎你的关注~
四面快手、终拿Offer,想告诉你的一些事情的更多相关文章
- 【科创人独家】PingCAP黄东旭:想告诉图灵这个世界现在的样子
创业是投己所好 科创人:作为技术圈内著名艺术青年,哪个瞬间会让您更开心,完成一段优美的代码或者乐谱?还是得到来自外界的欢呼与掌声? 黄东旭:在创业之前的很长一段时间里,完成一段代码.写完一首好曲子那一 ...
- 四面美团,收割 offer
阅读本文大概需要 6 分钟. 来源:https://blog.csdn.net/csuliyajin2012/article/details/49430659 美团我是在拉勾网上投的简历,之前也投过一 ...
- 秋招打怪升级之路:十面阿里,终获offer!
本文转载自:https://gongfukangee.github.io/2019/09/06/Job/ 作者:G.Fukang 开源项目推荐: JavaGuide: Java学习+面试指南!Gith ...
- 三本毕业(非科班),四次阿里巴巴面试,终拿 offer(大厂面经)
作者:gauseen 原文:https://github.com/gauseen/blog 公众号:「学前端」,只搞技术不搞广告文,欢迎关注~ 第一次 20:00 电话一面 - 自我介绍 - 对公司工 ...
- 【面经分享】互联网寒冬,7面阿里,终获Offer,定级P6+
点赞再看,养成习惯,微信搜索[敖丙]关注这个互联网苟且偷生的工具人. 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点.资料以及我的系列文 ...
- 面试阿里被“吊打”,一问Spring三不知,半年后二战终拿下offer
Spring框架是一个为Java应用程序的开发提供了综合.广泛的基础性支持的Java平台.Spring帮助开发者解决了开发中基础性的问题,使得开发人员可以专注于应用程序的开发. 近两年来,许多大厂在面 ...
- 我的阿里之路+Java面经考点
我的阿里之路+Java面经考点 时间:2018-03-19 23:03 来源:未知 作者:admin 点击:87次 我的2017是忙碌的一年,从年初备战实习春招,年三十都在死磕JDK源码,三 ...
- Android打造属于自己的数据库操作类。
1.概述 开发Android的同学都知道sdk已经为我们提供了一个SQLiteOpenHelper类来创建和管理SQLite数据库,通过写一个子类去继承它,就可以方便的创建.管理数据库.但是当我们需要 ...
- iOS - OC 面向对象语法
1.类 1)根类:因为类 NSObject 是层次结构的最顶层,因此称为根类. 可以将类称为子类(subclass)和父类(superclass),也可以将类称为子类和超类. 2)分类/类别(cate ...
随机推荐
- 5G 调制与解调
调制,就是将原始信号转换为适合在信道中传输的形式的一种过程,在无线通信中,调制一般均指载波调制,而解调则是调制的逆过程,即将原始信号从已调信号中恢复出来. 进行载波调制,主要为实现以下目标: 1)在无 ...
- Oracle用户、角色、权限
一.Oracle权限 系统权限:系统规定用户使用数据库的权限.(系统权限是对用户而言) 对象权限:某种权限用户对其它用户的表或视图的存取权限.(是针对表或视图而言的) 1.Oracle系统权限 o ...
- django基础之day08,ajax结合sweetalert的使用
models.py文件 from django.db import models class User(models.Model): username=models.CharField(max_len ...
- LinuxMint自定义快捷键
如图
- Java基础语法08-面向对象-枚举-包装类-接口
枚举 枚举是一种特殊的类它的对象是有限固定的几个常量对象. JDK1.5之前 构造器加private私有化 本类内部创建一组常量对象,并添加public static修饰符,对外暴露这些常量对象 JD ...
- 数据库学习笔记day01+day02
--表示系统时间select sysdate from dual --表是关系型数据库的基本结构--表是二维的,由行和列组成--行称为记录,列称为字段 --创建第一张表create table hw( ...
- 轻松玩转windows之redis实战
Redis是一个常用的键值对数据库.本篇分享一下如何轻松在睿江云上实现基于windows的redis开发环境. 1. 登录睿江云 点击右上角登录框 进入登录页面,输入账号密码登录 进入控制台, ...
- CentOS7安装ffmpeg
首先在官网http://ffmpeg.org/download.html下载ffmpeg-4.2.1.tar.bz2 以下为安装步骤: 1.使用工具将源码包上传至Linux主机 2.解压源码包 进入该 ...
- TortoiseGit 保存账号密码
TortoiseGit下载网址:http://download.tortoisegit.org/tgit/ 修改.gitconfig .gitconfig 用于记录git配置信息 路径:系统盘:\Us ...
- C# get folder's Md5 generated by file's and filename's md5. get dictionary md5
C# get dictionary md5 static string GetDicMD5(string dirFullName) { logBuilder = new StringBuilder() ...