面灵AI→

华为OD Java 社招上岸复盘:小厂两年、定级 D3

轮次
综合
时间
2026-10
来源
牛客网

《面试题目》

机考(3 道算法题,满分 400,150 过线)

  1. 字符串处理,边界条件较多
  2. 双指针 + 哈希表优化,暴力会超时
  3. 区间类贪心,排序后扫描一遍即可

技术一面

  1. HashMap 底层结构和扩容机制
  2. ConcurrentHashMap 和 HashMap 的区别,锁是怎么做的
  3. 线程池的七个参数、工作流程、拒绝策略
  4. JVM 内存区域划分,垃圾回收算法和回收器
  5. synchronized 和 volatile 的区别,锁升级的过程
  6. Spring Bean 的生命周期、循环依赖怎么解决
  7. 深挖项目:接口从几秒优化到毫秒级是怎么做的

技术二面

  1. 项目与技术选型

主管面

  1. 为什么离开上一家、未来几年的打算、能不能稳定

《参考解析》

机考怎么准备:三道题的难度分布是「一道手写模拟 + 一道需要优化到 O(n) + 一道贪心或动规」,卡人的往往是边界和超时。前两题一定要先做扎实保证拿分,第三题即便思路没走完也要把暴力版提交上去;区间贪心、双指针、哈希计数、字符串模拟这几类是高频。工作过的人别觉得自己稳——手感和应届生一样会掉,考前按力扣经典题刷一遍是必要成本。

HashMap 与 ConcurrentHashMap:HashMap 是数组 + 链表 + 红黑树,容量为 2 的幂、负载因子 0.75,扩容成倍增长并用高低位链表拆分。它线程不安全(并发扩容在 JDK 7 会成环、JDK 8 会丢数据)。ConcurrentHashMap 在 JDK 7 用分段锁,JDK 8 改成 CAS + synchronized 锁单个桶头节点:桶为空用 CAS 插入,否则 synchronized 锁住头节点,扩容支持多线程协助(sizeCtl、ForwardingNode)。读操作基本无锁靠 volatile 保证可见性,size 用 CounterCell 分散计数。这套设计的核心是把锁粒度降到单个桶。

线程池与 JVM:七个参数是核心线程数、最大线程数、空闲存活时间、时间单位、阻塞队列、线程工厂、拒绝策略。工作流程是:核心线程没满就建线程,满了入队,队满再扩到最大线程数,还是满就走拒绝策略(AbortPolicy 抛异常、CallerRunsPolicy 回退调用者、Discard / DiscardOldest 丢弃)。参数怎么定要分任务类型:CPU 密集取核数 + 1,IO 密集按「核数 × (1 + 等待时间 / 计算时间)」估,再用压测校准;队列必须有界,无界队列会把内存吃爆。JVM 内存分堆(新生代 Eden + Survivor、老年代)、方法区 / 元空间、虚拟机栈、本地方法栈、程序计数器、直接内存。回收算法有标记清除、标记复制、标记整理,回收器有 Serial、Parallel、CMS、G1、ZGC,选型看堆大小和停顿要求。

锁与 Spring:synchronized 是关键字、JVM 层面实现、可重入、非公平、能修饰方法和代码块;volatile 只保证可见性和禁止指令重排,不保证原子性(i++ 照样丢更新)。锁升级路径是无锁 → 偏向锁 → 轻量级锁(CAS 自旋)→ 重量级锁(内核互斥量挂起),目的是在没有竞争时省掉系统调用。Spring Bean 生命周期:实例化 → 属性注入 → Aware 回调 → BeanPostProcessor 前置 → @PostConstruct / InitializingBean → 后置处理(AOP 代理在这里生成)→ 使用 → 销毁。循环依赖靠三级缓存解决:一级放成品、二级放早期暴露的对象、三级放能生成早期引用的 ObjectFactory;只能解决单例的 setter / 字段注入,构造器注入和原型 Bean 解决不了。

主管面与这条路的现实判断:主管面基本不问技术,问的是「为什么走、为什么来」以及稳定性——离职原因要给一个向上走的理由(技术栈停滞、想换平台),不要说前司坏话;能不能长期待、有没有考公考研的打算要回答得明确。这位作者的最后结论也值得记下来:小厂跳大厂会卡学历和背景,OD 是一条相对友好的通道,定级定薪、绩效由华为直接管理,和「想象中那种外包」不是一回事,但前提是你得把项目讲清楚——把自己真实解决过的一个具体问题(比如把接口从几秒优化到毫秒)讲透,比包装成高并发架构有用得多。

原帖为内推性质的长文复盘,这里只保留面试相关部分。