岗位
Java后台开发实习生
时间表
- 2020/3/18 提交简历 & 测评
- 2020/3/23 笔试
- 2020/3/26 简历面
- 2020/4/11 技术一面
- 2020/4/14 技术二面
- 2020/4/17 交叉面
- 2020/4/20 HR面
- 2020/4/22 意向书
背景
简单说明一下,希望可以给各位一个参考。
- 211本科生,目前大三
- 初中的时候开始学Java
- 初中的时候编写Minecraft的CoreMod,这个Mod维护至今已在GitHub获得192的star
- 大学期间打过ACM,拿过ICPC的银奖、铜奖和CCPC的铜奖。
简历面
简历面是一个晚上突如其来的电话面试。
论文是什么方向?
本科大三未写论文Java有学过专业的课程吗?
学过有了解过JVM相关的问题吗?能大概介绍一下吗?
讲了一下类加载机制、内存结构和GC算法- 各个垃圾回收器有什么区别?
- 什么情况下会Stop The World?
各个垃圾回收器STW的时机不完全相同,需分别讨论。 - 什么情况下用G1?
实时性要求高 - G1和CMS有什么区别?
GC算法不同,G1为标记-整理、CMS为标记-清除,以及内存结构不同
- 什么情况下会Stop The World?
- 各个垃圾回收器有什么区别?
对Java的集合了解吗?知道底层是怎么实现的吗?
讲了一下ArrayList
、LinkedList
、Hashtable
、HashMap
、ConcurrentHashMap
、LinkedHashMap
、HashSet
的实现原理Tip:Java集合几乎是面试必考题,尤其是
HashMap
和ConcurrentHashMap
请务必深入理解其用途和实现原理,这两个集合在Java 7及以前和Java 8及以后的实现原理是不一样的,尽可能都了解一下- 哪些集合可以存放
null
?
上述集合除了Hashtable
和ConcurrentHashMap
都可以。 - 哪些集合可以存放重复的元素?
Set
不能重复,Map
的key
不能重复。
- 哪些集合可以存放
Java多线程中一般使用哪些锁?
讲了ReentrantLock
和synchronized
关键字的用法和实现原理synchronized
关键字可以加在static
方法上吗?锁的是什么?
可以,锁的是Class
对象synchronized
关键字加在非static
方法上时锁的是什么?
锁的是类的实例ReentrantLock
的特点和使用方法?
讲了“可重入”的概念及实现方式以及lock
、tryLock
、unlock
等基本的方法,以及使用这些方法实现一个简单的自旋锁的原理
Tip:ConcurrentHashMap
在Java 7及以前使用的是可重入锁,不妨了解一下其如何使用可重入锁来实现线程安全
线程之间共享哪些内容?
不共享JVM调用栈、本地调用栈和程序计数器- 如何访问这些共享的内容?
先访问CPU缓存,再访问Java内存,会有缓存一致性问题,可以使用volatile
关键字volatile
和synchronized
的区别?
一个保证缓存一致性,一个解决执行控制问题
- 如何访问这些共享的内容?
有做过什么项目吗?介绍下做过的项目?
- Minecraft的CoreMod,使用了Java字节码修改框架ASM,使用了Gradle作为构建工具
- Vue.js+Spring Boot项目,前后端分离
- 对Spring Boot了解多少?
讲了一下Spring全家桶,比如AOP、IoC等特性和实现,还有Spring Boot的配置特性 - 了解MySQL的引擎吗?
讲了一下MyISAM和InnoDB的索引方式,聚簇索引和非聚簇索引的区别 - 如何优化SQL语句?
讲了一下索引的优化,最左匹配原则、索引失效情况和索引区分度
- 对Spring Boot了解多少?
技术一面
原本这一面约了一个阿里会议的视频面试,临近面试时接到面试官电话表示要去开会,晚上约了新的时间变为电话面试。
- Minecraft的CoreMod
- 独立开发的吗?做给谁使用呢?
独立开发的,让对这个mod感兴趣的Minecraft玩家使用 - 14年就开始开发了?高中的时候就开始自学Java了吗?
是的,是初中的时候开始自学Java - 讲一下Gradle和Maven的差异?
都是一个构建工具,也相当于一个依赖管理器;Maven使用固定配置文件,Gradle使用DSL来编写构建脚本,并且使用task来组合构建任务- Gradle相对于Maven有什么缺点吗?
Gradle上手难度较大,需要学习基于Groovy和Java 6的Gradle DSL或Kotlin DSL来编写构建脚本
- Gradle相对于Maven有什么缺点吗?
- 讲一下核心的实现逻辑?
通过修改主类,在Minecraft主类执行前先创建自定义ClassLoader
,将Minecraft的所有类都在自定义ClassLoader
加载,在findClass
时,根据预设的逻辑使用ASM修改指定的类- 描述一下Java的类加载机制?
讲了一下双亲委派模型的实现方式和作用
- 描述一下Java的类加载机制?
- 独立开发的吗?做给谁使用呢?
- Vue.js+Spring Boot项目
- 独立开发的吗?有多少人在用?
前端、后端、Android都是自己独立开发的,没多少人在用 - 简单介绍一下架构?
前端使用了Vue.js、VueCLI、Webpack,后端使用了Spring Boot、Spring Data Jpa
前端通过axios带上token访问API调用后端,后端收到API请求后验证token访问数据库并返回json响应
前端由Webpack打包后直接缓存在CDN,后端通过CDN回源访问 - token是怎么生成的?token存在哪里?
讲了一下JWT和UUID,token存在LocalStorage中 - 有在服务端做负载均衡吗?
就一台服务器当然没做了,讲了一下数据库的负载均衡和微服务的负载均衡
- 独立开发的吗?有多少人在用?
- 描述一下
HashMap
的实现方式?必考题又来了,Java 7及以前是数组+链表、Java 8及以后是数组+链表+红黑树、Java 8红黑树转变的条件、如何减少hash碰撞、数组的大小和如何用位运算代替取模、Java 7多线程扩容死循环问题、Java 8扩容时如何减少移动提高性能 Hashtable
和ConcurrentHashMap
都是线程安全的,实现上有什么差异?又是一道必考题,一般Java线程安全的Map
有三种实现方式Hashtable
是旧版本Java的遗留类,继承自另一个遗留类Dictionary
,线程安全的实现方式为简单粗暴地给get
和put
等方法加上synchronized
关键字Collections.synchronizedMap
方法,使用装饰者模式来给get
和put
等方法加上synchronized
语句块,由于即使不考虑Hashtable
的线程安全开销,Hashtable
的实现性能也低于HashMap
,因此使用此方法装饰HashMap
会比直接使用Hashtable
更为高效ConcurrentHashMap
是java.util.concurrent
包里的线程安全Map
,Java 7及以前为分段+数组+链表,在每个段中使用可重入锁;Java 8为数组+链表+红黑树,在数组的每个位置使用CAS来进行轻量级锁
HashSet
了解吗?
根据HashSet
是否有序,底层使用HashMap
或者LinkedHashMap
,以Set
中的元素作为Map
中的key
,以固定的Object
对象作为Map
中的value
- 如何保证
Set
中的元素不重复?
重写对象的equals
和hashCode
方法 - 解决哈希冲突的方法?
线性探查法、平分探查法、拉链法 - 常用的哈希算法?
MD5、SHA-1、SHA-256
- 如何保证
- 常用的排序算法?
- O(n^2) 冒泡排序、插入排序、选择排序
- O(nlogn) 快速排序、堆排序、归并排序
- O(n) 计数排序、基数排序、桶排序
- 快速排序是怎么实现的?
选一基准值,使其左边小于它,右边大于它,分治这一过程 - 堆排序是怎么实现的?
使用数组建立堆,往堆中插入所有元素,依次从堆顶取出
- 了解工厂模式吗?
简单工厂模式、工厂模式、抽象工厂模式- 有什么好处?
对象创建实现细节对用户类隐藏
- 有什么好处?
- 了解观察者模式吗?
EventListener、消息队列常用的订阅-发布模型 - InnoDB索引的数据结构是什么?
讲了一下B+树的结构 - 去年拿了ACM区域赛的银奖?
是的- ACM比赛的形式?
三人团队参赛 - 一般解决哪些问题?
解决给定场景下的算法问题 - 比如根据历史数据预测未来?
此算法非彼算法,这种问题可能更倾向于机器学习或者数学建模
- ACM比赛的形式?
技术二面
面试官在约定时间一小时后仍未联系,通过官网小蜜催了面试官,最后使用阿里会议进行视频面试,面试官表示刚才在开会,又是开会,只面试了十几分钟,估计又回去开会了。
- 编译原理、操作系统、数据库课程的实验做什么?
编译原理以理论知识为主、操作系统实现HTTP服务器、数据库课程的实验使用数据库开发程序- 数据库的作业不是去实现一个数据库是吗?
是的,没这个水平呀 - HTTP Server 是怎么设计的?
从Socket解析HTTP协议,并根据请求内容读取并返回对应的静态文件,实现了多进程模型、多线程模型,并实现了内存缓存机制和简单的文件系统 - 如何解析HTTP协议?
讲了一下HTTP请求和响应的格式 - 词法分析和语法分析做过什么?
最近做过一个LeetCode的本地执行器,从控制台解析样例输入的格式和内容,直接调用Solution
中对应的方法,免去每次编写main
方法传参数,便于本地运行和调试
- 数据库的作业不是去实现一个数据库是吗?
- Minecraft的CoreMod
- 对Java字节码的理解?
讲了一下Java代码编译运行的过程 - 为什么用ASM?
灵活度高,可以在字节码层面随意修改,只要通过JVM的字节码验证就行
- 对Java字节码的理解?
- 对
java.util.concurrent
包的了解?
讲了一下ConcurrentHashMap
、ReentrantLock
、ThreadPoolExecutor
、AtomicInteger
ConcurrentHashMap
线程安全是如何实现的?上面写过啦,不重复了
- 数组里找到前n大的数
快排变形,类似于取得第k大的数
https://leetcode-cn.com/problems/kth-largest-element-in-an-array/
交叉面
交叉面是一位来自蚂蚁金服的面试官,提前加了钉钉,使用钉钉进行视频面试,也喜闻乐见的被咕了将近半小时。
在学校里打比赛的情况?
ACM-ICPC区域赛银奖、CCPC区域赛铜奖、蓝桥杯国一- ICPC是什么类型的比赛?
算法比赛,三人团体参赛,先网络赛拿资格再进行现场赛 - 印象比较深刻的算法题目?
邦邦算分,降维问题 - 降维算法有哪些?
又是机器学习的算法,此算法非彼算法 - 对笔试有什么总结?
阿里的笔试太难了 - 比较了解哪些类型的算法题?
排序、搜索、数论、贪心、动态规划等ACM常见问题 - n个在不同城市的人去同一个城市聚会,求最短总时间
以聚会城市为中心BFS,找到去往各个城市的时间 - 如何在实际业务场景中结合算法?
将实际问题建模,确定适合的算法
- ICPC是什么类型的比赛?
Vue.js+Spring Boot项目
- 有碰到什么难点吗?
服务器带宽不足,前后端分离、CDN - 数据存在哪里?
MySQL数据库,用的是MariaDB - 如果程序使用者增多会有什么问题?
单表规模过于膨胀、后端和数据库访问压力过大 - 如何拆分数据表?
根据时间的维度来拆- 如何解决较大时间范围跨表查询的问题?
多表并行查询,再进行组合
- 如何解决较大时间范围跨表查询的问题?
- 有碰到什么难点吗?
项目都是自己出于兴趣做的?是在什么样的情况下做这两个项目?如何进行测试工作?
是的,为了练手- 独自开发?
是自己一个人做的 - 如何进行测试工作?
单元测试+人工测试- 后端的单元测试使用了什么测试框架?
JUnit 5
- 后端的单元测试使用了什么测试框架?
- 独自开发?
Spring如何使用事务?
讲了一下@Transactional
的使用方法和实现原理- 事务的注意事项?
public
方法、自调用无效、回滚一致性、异常处理机制 - 事务的传播机制?
七种传播机制 - 什么时候会触发异常回滚?
事务方法抛出RuntimeException
- 如何实现分布式事务?
TCC分布式事务,try、commit、cancel,利用补偿机制和幂等性解决事务一致性问题
- 事务的注意事项?
HR面
关于对未来的规划和实习时间相关的问题以及对于面试部门的了解,在前四面中也被问过几次,就不在上文重复了;这类问题每个人的回答都不一样,就不给出解答了。
HR面也是提前加了钉钉的好友,然后进行的钉钉视频面试。
- 如何看待阿里这家公司?为什么说阿里在Java领域做的比较好?
- 为什么会选择这个事业部呢?
- 之前有用过我们事业部的产品吗?如何看待我们的产品?
- 对于游戏行业和互联网行业,有什么偏好吗?
- 自己对编程语言的选择和判断?
- 在Java多年的开发过程中,有什么总结和心得吗?
- 觉得自己有什么优点和待发展的点?
- 是什么支撑你愿意自学?
- 项目成功对于你的意义在哪里?
- 这一次找工作的目标是什么?
- 如果获得了阿里的实习机会,希望获得哪些成长?会有哪些挑战?
- 对前几面的面试官有什么评价吗?
- 之前有实习过吗?
- 为什么选择现在的学校?
- 对团队的风格和氛围有什么喜好吗?
- 自己在合作中是处于什么样的角色呢?
- 和同学在协作中存在什么困难吗?
- 对自己毕业之后的成长有做过什么规划吗?
- 平时会看一些技术类的书籍吗?看这些书籍对你的意义是什么?
- 如何判断和选择offer?
总结
阿里的面试很注重项目和基础,并会结合一定的实际业务问题进行考察。建议可以做一些拿得出手的项目,这样可以在面试的时候给面试官一个好的印象,并将面试问题引导到熟悉的领域;反之,如果为了项目经验写一些自己参与过但不熟悉的项目,很可能就会遇到一问三不知的情况,建议在写项目经验时只写自己熟悉的。
Java基础是非常重要的考点,其实Java基础要准备的内容并不多,问来问去其实也就是那几类的问题,重点复习集合和并发相关的知识,最好可以对JVM深入理解。Spring框架不用多说,Java后端面试几乎是必考的,多了解一下工作流程,如果有余力的话甚至可以去看看实现的代码或者自己实现一个简单的框架。实际业务问题最好去先了解一下自己申请的事业部是做什么的,多思考一下一般会遇到哪些业务问题。
阿里面试过程中使用了阿里会议和钉钉两个平台进行面试,其他公司大部分都使用牛客网,因此在阿里的面试过程中没有遇到手撕代码的情况,但这并不意味着算法基础不重要,阿里的笔试是数一数二难的,我其他公司基本笔试都能全做出来,阿里却做的不尽人意,面试官是可以看到你的笔试成绩的,第一印象很重要,如果实在是没有做出笔试题,一定要在笔试后复盘去学习一下如何做,面试的时候还有可能会再问你。
面试过程前后经历了一个多月的时间,也感受到了阿里工作的忙碌。成功通过五面拿到了阿里的实习offer,或许只是运气好罢了,但多总结面试经验,多复盘面试问题,一定会在某种程度上增加通过面试的机会,相信各位多多积累经验,也一定可以拿到自己心仪的offer。
最后特别感谢253学长在一路上的帮助和支持!
小声问一句有机会上精华吗
全部评论
(21) 回帖