华为校招Java开发面试全流程:从机考到offer的完整攻略

后端校招作者: 美历团队

985应届生分享华为校招Java开发全流程面经,涵盖机考3题、技术一面Java基础与JVM、技术二面Spring与数据库、HR面,最终拿到offer。

背景介绍

我是一名985高校的应届本科毕业生,专业是软件工程。从大三开始就确定了要走Java后端方向,实习经历有一段中型互联网公司的Java开发实习。华为校招是我秋招的重中之重,毕竟华为的待遇和平台在业内都是顶级的,而且我身边很多学长学姐都在华为工作,提前了解了不少内部情况。

华为校招的流程比较特殊,跟大多数互联网公司不一样,它是先机考再面试的。我是在9月份投的简历,岗位是Java开发工程师,整个流程从机考到拿到offer大概经历了一个半月。说实话,这个过程真的很煎熬,尤其是等待机考成绩的那段时间,每天都在刷牛客看别人的面经。

下面我就把整个流程详细复盘一下,希望对正在准备华为校招的同学有所帮助。

面试流程复盘

机考环节(3道编程题,2小时)

华为的机考是必须过的第一关,3道题满分600分,一般要拿到150分以上才有面试机会(不同部门要求不同,有的要求200分以上)。机考平台用的是华为自己的系统,支持Java、C++、Python等语言。

第一题(100分):字符串处理

题目大概是给一个字符串,要求统计其中某个模式出现的次数。这道题比较简单,我用String的indexOf方法循环查找就过了,大概15分钟搞定。

第二题(200分):滑动窗口

题目是给一个数组和窗口大小,求滑动窗口内的最大值。这道题是LeetCode 239的原题,我之前刷过,用双端队列解决的。不过机考的时候有点紧张,写的时候出了一个小bug,调试了大概10分钟才过。

第三题(300分):动态规划

题目是关于路径规划的,类似LeetCode上不同路径的变体,但加了障碍物和权重。这道题我只拿了部分分,最后大概过了60%的测试用例。DP的状态转移方程想得不够清楚,边界条件也没处理好。

最终机考成绩400分左右,顺利进入面试环节。

技术一面(约50分钟)

一面是在华为园区进行的线下面试,面试官是一位看起来三十多岁的资深工程师,态度很和蔼。

Java基础部分:

面试官先问了Java基础,这部分问得很细。

1. HashMap的底层实现?我说了JDK1.8的数组+链表+红黑树结构,还讲了扩容机制和负载因子。面试官追问了HashMap为什么线程不安全,我说了多线程put可能导致数据覆盖,以及JDK1.7中并发扩容可能导致链表成环的问题。

2. ConcurrentHashMap的实现?我说了JDK1.8的CAS+synchronized,Node数组的每个桶用synchronized加锁,比JDK1.7的Segment分段锁更细粒度。

3. JVM内存模型?我从线程私有(程序计数器、虚拟机栈、本地方法栈)和线程共享(堆、方法区)两个维度讲了一遍。面试官追问了垃圾回收算法,我说了标记-清除、标记-整理、复制算法,以及分代收集理论。

4. volatile关键字的作用?我说了保证可见性和禁止指令重排序,还讲了happens-before原则。面试官问volatile能不能保证原子性,我说不能,举了i++的例子。

项目部分:

面试官让我讲了实习项目,我主要说了项目中用到的Spring Boot + MyBatis架构,以及如何用Redis做缓存优化。他追问了缓存穿透和缓存雪崩的解决方案,我分别说了布隆过滤器和随机过期时间。

手写代码:

面试官让我手写一个单例模式的DCL(双重检查锁定)实现。我写了,但忘了加volatile,面试官提醒了我。这里要注意,DCL单例必须加volatile,否则可能因为指令重排序导致拿到未初始化的对象。

技术二面(约60分钟)

二面的面试官级别更高,问的问题也更偏向架构和系统设计。

Spring部分:

1. Spring IOC的原理?我从BeanDefinition的解析讲起,说了Bean的实例化、属性注入、初始化的完整生命周期,还提到了三级缓存解决循环依赖。

2. Spring AOP的实现方式?我说了JDK动态代理和CGLIB代理的区别,以及Spring默认的选择策略(有接口用JDK代理,没接口用CGLIB)。

3. Spring Boot的自动装配原理?我说了@EnableAutoConfiguration注解通过SpringFactoriesLoader加载META-INF/spring.factories中的配置类,然后根据条件注解过滤。

数据库部分:

1. MySQL索引的底层数据结构?我说了B+树,讲了B+树相比B树的优势:叶子节点形成链表便于范围查询、非叶子节点只存键值使得每个节点能存更多键值从而降低树高。

2. 事务的隔离级别?我说了读未提交、读已提交、可重复读、串行化,以及每个级别可能存在的问题(脏读、不可重复读、幻读)。面试官追问MySQL默认的隔离级别,我说是可重复读,并讲了MVCC的实现原理。

3. 如何优化慢查询?我说了看执行计划、加索引、避免全表扫描、减少回表等。

系统设计:

面试官给了一个场景:设计一个短链接服务。我从发号器生成短码、数据库存储映射关系、缓存加速查询、301/302重定向选择这几个方面说了一下。面试官追问了高并发下如何保证发号器不重复,我说了可以用雪花算法或者Redis自增。

HR面(约20分钟)

HR面比较轻松,主要问了这些问题:

1. 为什么选择华为?

2. 最大的挫折是什么?怎么克服的?

3. 对加班怎么看?

4. 期望薪资?

5. 有没有其他offer?

这些问题我提前都准备过,回答得比较自然。关于加班,我没有直接说不愿意,而是说在项目需要的时候可以接受加班,但也会注意提高工作效率。关于其他offer,我如实说了还在等几家的结果。

真题汇总

1. HashMap底层实现及线程安全问题

2. ConcurrentHashMap的实现原理

3. JVM内存模型及垃圾回收算法

4. volatile关键字的作用及原子性问题

5. 单例模式DCL实现(手写)

6. Spring IOC原理及三级缓存

7. Spring AOP的JDK动态代理和CGLIB

8. Spring Boot自动装配原理

9. MySQL B+树索引结构

10. 事务隔离级别及MVCC

11. 慢查询优化方案

12. 短链接服务系统设计

13. 机考:字符串处理、滑动窗口最大值、动态规划路径规划

心得建议

1. 机考一定要提前刷题。华为机考的难度不算太高,但如果不提前准备,很容易在第二题和第三题上翻车。建议至少刷LeetCode hot 100,重点练习字符串、滑动窗口、动态规划这几类题型。机考分数越高,后续面试的主动权越大。

2. Java基础要系统复习。华为对Java基础的考察非常全面,从集合框架到并发编程到JVM,几乎每个模块都会问到。建议按照《Java并发编程的艺术》和《深入理解Java虚拟机》这两本书来系统复习,不要只看面经。

3. Spring全家桶要理解原理。不要只会用Spring Boot写CRUD,要理解IOC、AOP、自动装配的底层原理。面试官很看重你是否知其然也知其所以然。

4. 数据库知识不能丢。MySQL的索引、事务、锁是高频考点,建议把《高性能MySQL》的核心章节过一遍。面试中如果能结合实际项目讲优化经验,加分很多。

5. HR面不要掉以轻心。很多人觉得HR面就是走过场,其实华为的HR面也是有筛选的。回答问题要真诚但也要注意分寸,尤其是加班和薪资这类敏感话题。

6. 整个流程要有耐心。华为校招的流程比较长,从投简历到拿offer可能要一个多月。期间可能会有很长时间没有消息,不要焦虑,耐心等待就好。

FAQ

Q:华为机考多少分能过?

A:一般来说150分以上就有面试机会,但不同部门要求不同,建议尽量考到200分以上更稳妥。

Q:机考用什么语言好?

A:投Java岗位的话建议用Java,虽然Python写起来更快,但面试官可能会看你的代码风格。

Q:面试是线上还是线下?

A:我那次是线下,在华为园区面试。但不同批次可能不同,具体看通知。

Q:技术二面会问算法吗?

A:我二面没有单独出算法题,但系统设计环节会考察你的思维逻辑,本质上也是一种算法思维的体现。

Q:HR面会刷人吗?

A:会的。虽然通过率比较高,但如果表现太差或者价值观明显不合,还是会被刷。认真对待每一面。

#华为#Java#校招#机考#JVM#Spring#MySQL#系统设计