本人情况:澳洲Top2本,科班出身,Java后端开发,无大厂实习经历,今年年底毕业。
在刚结束的秋招中有幸参加了几家国内大厂的面试,一路被虐过来的同时也能见到自己的成长。在准备秋招的时候从牛客前辈们的帖子里收获良多,故发一篇面经回馈社区,也给自己做一个总结。
技术面试都在45分钟到2小时不等,有的面试时间有点久远,所以可能会记漏问题或者记串公司。问题后的括号里是我的理解,有不对的地方欢迎指正。
笔试部分就不总结了 无非是选择题,场景题加在线编程题,在牛客刷过题的朋友应该都没问题。
阿里-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, htt