本人情况:澳洲Top2本,科班出身,Java后端开发,无大厂实习经历,今年年底毕业。
阿里-Java研发工程师:
提前批一面(蚂蚁金服,电话面):
先过了一遍简历上的项目,根据项目提了一些问题
- Servlet和Jsp的本质?它们有什么区别(后者是前者的高一级封装,都编译成独立的.class字节码)
- Servlet创建的过程
- Servlet中的变量是否需要加锁(单实例多线程)
- 用户数据有没有加密,用了什么加密方法
- 服务器是否是分布式
- 数据库是否是分布式,总共有几张表
接着是基础:
- 讲讲HashMap的底层实现原理,get的过程发生了什么(hashCode和equals方法)
- 讲讲对数据库事务的理解(ACID,隔离级别)
- 讲讲悲观锁和乐观锁
最后是共享屏幕编程:
- 输入一个长字符串,打印出其中出现的每个词及其出现次数。(我说用字典树,面试官说只能用Java自带类库。最后用正则表达式加HashMap写出)
- 分析一下算法复杂度
- 能来实习吗
提问环节
二面(电话面):
- 大学期间有哪些印象深刻的计算机课程?(函数式编程,面向对象,算法与数据结构,关系型数据库,分布式与并发,计算机组成与程序运行原理,操作系统,编译原理)
然后面试官提出相关的问题:
- 什么是函数式编程,和Java的面向对象思想有什么区别
- 讲讲你对Haskell这门语言的理解(函数的柯里化,无副作用,惰性求值)
- 为什么Haskell很少用于工业开发(无副作用的按值传递带来效率问题,开发者社区的商业资金注入不足,学习成本较高)
- 按值传递和按引用传递的区别?
- 方法A调用方法B的过程中方法栈上发生了什么(栈帧的创建与销毁)
- 栈帧中包含哪些内容?
- 讲讲HashTable和HashMap的区别(hash定位方式,线程安全性)
- 你会怎么实现乐观锁和悲观锁
- 讲讲对Volatile的理解(禁止指令重排,通过无效化缓存行保证多线程可见性)
- 对缓存行了解多少,伪共享知道吗(MESI缓存一致性协议,JDK8的Contended注解)
- 平时Linux用得多不,常用的命令?
- Linux系统运行缓慢的时候你会怎么做
- 操作系统Mount一个设备的时候是在做什么(给当前文件系统提供一个访问设备数据的入口)
- 命令行里按Ctrl-C发生了什么(父进程向子进程发送终止信号)
- 信号和中断的区别(前者可以在用户空间内定义子流程,且为有时延的异步执行过程,后者需要根据系统中断向量表查找相应子流程或由设备驱动提供子流程,且涉及内核态和用户态的切换)
- 什么是文件系统
- 文件系统是怎么组织的
- 你有什么问题想问我的吗
专场初面(阿里妈妈,视频面):
- 先做个自我介绍吧
- 详细讲讲简历上的每个项目,用到什么技术,从中获得什么收获
- 给一长串数字,其中每个数字的出现次数相当,且其中大部分为1到3000的小数字,少部分为上界不确定的大数字,针对这串数字设计一个2进制无损压缩算法。(阐述思路的时候提到了哈夫曼编码)
- 讲讲哈夫曼编码的思想和建树过程?
- 哈夫曼编码方式在这个场景中是否适用,为什么(不适用,元素数量多且各元素频数差距小的情况下哈夫曼效率低下)
- Java的Object类中有哪些方法,各自的用途
- 讲讲对面向对象的三大特性的理解
- Java中有哪些访问控制符,各自的范围(public > protected > default > private)
- 讲讲熟悉的垃圾回收器(G1)
- 讲讲Spring的AOP和IOC
- 对http协议的理解(基于TCP协议,C/S模型,对URI的操作)
- 讲讲TCP的三次握手过程,为什么一定要三次
- 知道哪些http请求方式,用过哪些(GET, POST, PUT, UPDATE, DELETE)
- GET和POST的区别(消息体,用途,URL,书签,传输格式,长度限制)
- 讲讲http长连接(http1.0的connection: keep-alive, http1.1的默认方式,通过心跳包保活)
- http和https的区别(后者要先通过SSL层的非对称握手过程获得协定的对称密钥,用于后续会话的加/解密)
- MySQL数据库引擎有了解吗
- 讲讲数据库的4个隔离级别(读取未提交,读取已提交,可重复读,串行化)
- 数据库索引用了什么数据结构(B加树)
- B加树的实现原理,和B树的区别
- 组合索引了解吗
- 使用组合索引时有什么需要注意的(最左匹配)
- 给出下列常用的SQL语句,如何建立索引?如果我现在在这个字段上建立了索引,那执行这个SQL语句时会不会用到这个索引?(需要注意最左匹配,模糊查询,or查询,中间提到了SQL语句执行前的预优化阶段)
- 手撕代码:N个数中取最大的10个数,N > 10000。(维护一个元素数为10的小根堆,把所有数据过一遍)
- 分析一下这个算法的复杂度(O(n) 时间, O(1) 空间)
- 加个微信?
- 你有什么想问的吗
终面(电话面)
聊天,个人经历相关:
- 简单地介绍一下自己
- 有女朋友吗
- 留学几年的收获
- 课余时间喜欢做些什么
- 在学校做过什么学生工作
- 在学校成绩怎么样
- 对自己的职业规划是怎样的
技术问题:
- 讲讲网络分层,每一层都有哪些协议(TCP/IP五层模型)
- 浏览器从输入URL到页面显示的过程中发生了什么,越详细越好(解析URL,解析DNS(缓存未命中的情况下需要从根域名开始递归查询),建立TCP连接,http请求与答复,Render树的建立,页面的渲染)
- 讲讲http报文的格式?请求和答复有什么不同
- 自己抓包看过没(Wireshark)
- 现在有1T的文本数据,每行表示一个关键词,求出现次数最高的10个关键词,限定单机只有4G内存。(先假定内存足够,则用HashMap加小根堆可解, 再解决内存的问题:先用hash方法把1T的文本文件散列成多个足以读入内存的小文本文件,分别对每个文件做统计,最后对每个文件的统计结果做总统计)
- 你觉得你的方案有什么不足吗(数据分布可能不均匀,可对文本数据采用多次hash,直至单个数据样本足够小)
- 现在有一个包含上亿条目的表,现实中会有大量的用户在这个表上做基于uuid的查询操作,如何改良这个系统的可用性(对这张表的uuid用哈希法做水平切分并建立索引,然后在用户查询时用同样的哈希算法导向到相应的表)
- 你说的是数据库层面的优化,对别的层面有什么想法吗,比如用户查询存在高峰期,如何在节约服务器资源的前提下保证对高并发的容忍度。(在服务器端建立令牌池,每隔固定时间向其中发放令牌,令牌总数有限。每个查询在执行前必须先获取令牌。令牌总数即为某个时刻下服务器可承载的最大并发数,令牌发放间隔即为最大用户增速)
接着聊天,国内互联网行业发展相关
总结:面试体验好,面试官亲切,问问题时会做一些引导和提示,也会告诉你哪些方面存在不足,总体比较注重基础知识,尤其是对Java语言本身的理解。手写代码的题比较简单,应该是想考察编码规范程度。面试官水平高,什么都能聊。但电话面试不会预约,你也不知道什么时候会突然来电话(一面和二面的时候我就在睡觉,时差党)。专场初面面试官是个清秀的小姐姐。
名企HR一对一咨询
名企HR一对一咨询
阿里相关
阿里相关公司