这是一位球友投稿的东方财富服务端开发暑期实习面经,问的内容还是比较多的,难度也相对比较大。下面是正文。
最近参与了东方财富服务端开发暑期实习的招聘,并最终收获了 Offer。整个过程持续了大约一周,从技术一面、技术二面到最终的 HR 沟通,体验下来感觉公司非常注重候选人基础知识的广度与深度,同时也对实际问题的解决能力有较高要求。在此,我将整个面试过程进行复盘,希望能为志在东财或相关岗位的同学提供一些有价值的参考。
背景介绍
- 面试岗位: 服务端开发实习生 (Java)
- 面试流程: 技术一面 -> 技术二面 -> HR -> Offer
- 面试形式: 线上/线下均有,我经历的是线下面试
技术一面
一面的面试官非常和蔼,整体氛围比较轻松。面试时长约一小时,主要围绕 Java 基础、中间件、数据库等核心技术栈进行提问,考察知识的广度。问题由浅入深,覆盖面很广。
Java 基础与 JVM
- 面向对象: 我从封装、继承、多态三板斧切入去聊了挺多,面试官整体比较满意。
- 重载与重写: 我从方法签名、编译/运行期、以及与多态的关联等角度进行了解答。
- 集合与并发:
hashCode()
方法的作用是什么?它和equals()
方法有什么关系?我回答了其在哈希表中的作用,并强调了两者需要同时重写的原则。面试官追问了哈希冲突的解决方案,我提到了链地址法和开放地址法。TreeSet
是如何实现排序的?我解释了其底层基于红黑树,并需要对象实现Comparable
接口或在构造时传入Comparator
。LinkedBlockingQueue
和ConcurrentLinkedQueue
的区别?这个问题有点难了,考察了对 JUC 包的熟悉程度,我主要从是否阻塞、内部实现(前者基于ReentrantLock
,后者基于 CAS)、容量是否无界这三个角度去回答。
- JVM 内存模型与垃圾回收:
- “介绍一下 JVM 的运行时数据区”,我按照线程共享和私有的方式进行了划分和介绍。
- “为什么要进行垃圾回收?” 这是一个引导性问题,之后面试官深入问了 CMS 和 G1 回收器的核心区别,我从应用场景、回收目标(停顿时间 vs 吞吐量)、内存布局(连续 vs 分区)等方面做了对比。
数据库
- 事务特性与隔离级别: “谈谈数据库事务的 ACID 特性是如何实现的?” 我分别解释了原子性(Undo Log)、持久性(Redo Log)、隔离性(锁/MVCC)和一致性(由其他三者保证)的底层原理。紧接着,面试官让我说明了 SQL 标准的四种隔离级别以及它们分别解决了哪些并发问题(脏读、不可重复读、幻读)。
- 索引与调优: “B+树的结构是怎样的?为什么数据库索引常用它?” 我从非叶子节点只存索引、叶子节点存储数据且形成有序链表等角度,分析了其在范围查询和 I/O 效率上的优势。面试官还让我分享了一些 SQL 调优的实际经验。
- 分布式锁: “如果让你用 MySQL 设计一个分布式锁,你会怎么做?” 我提出了利用主键或唯一索引的唯一性约束来实现,并简单介绍了具体的方案。
缓存
- 高可用与持久化: “Redis 如何保证高可用?” 我介绍了主从复制、哨兵(Sentinel)机制和集群(Cluster)三种模式。接着,面试官问了 RDB 和 AOF 两种持久化策略的优劣和适用场景。
- 缓存生产问题: 经典缓存三件套(穿透、击穿、雪崩)的成因和解决方案是必考题。我结合布隆过滤器、缓存预热、热点数据永不过期、加锁更新、以及限流降级等策略进行了解答。
- 数据结构与热点 Key: “ZSet 的底层数据结构是什么?” 我回答了跳表(SkipList)和压缩列表(ZipList)。面试官进一步问了热点 Key 问题的解决方案,我提到了多级缓存、本地缓存以及将热点 Key 打散等方法。
其他
- RocketMQ: “请介绍一下 RocketMQ 的整体架构和核心组件”,我说明了 NameServer、Broker、Producer 和 Consumer 的作用。
- 网络与框架:
- HTTP 与 HTTPS 的核心区别是什么?我从安全性、证书、端口和连接过程等方面进行了解答。
- Nginx 常用的负载均衡算法有哪些?我列举了轮询、加权轮询、IP 哈希等。
算法手撕
- 题目: 零钱兑换 II (LeetCode 518)
- 要求: 给定不同面额的硬币和一个总金额,计算可以凑成总金额的硬币组合数。
- 分析: 这是一道典型的完全背包问题,考察动态规划能力。我定义了
dp[i]
为凑成金额i
的组合数,并写出了状态转移方程。虽然一开始有些紧张,但在面试官的引导下最终完成了代码。
一面小结
一面主要考察候选人技术栈的广度和对基础知识的掌握牢固程度,问题多但通常不会无限深入。建议准备时要全面复习,对每个知识点都要有清晰的理解。
技术二面
二面在一天后进行,面试官看起来是部门的技术负责人,气场很强。这一轮不再局限于八股文,而是更侧重于对项目经验的深入挖掘、对技术原理的抽象理解以及解决复杂场景问题的能力。
项目与实习经历深挖
面试官花了大量时间在我的实习经历和项目上,问题非常细致:
- “介绍一下你参与的那个秒杀项目,它的整体流程是怎样的?”
- “在你的项目中,分库分表是如何实现的?基于哪个中间件(如 Sharding-JDBC)?分片键是如何选择的?”
- “秒杀场景下如何解决超卖问题?库存一致性是如何保证的?”
- “你负责的模块中,遇到过最有挑战性的问题是什么?你是如何分析和解决的?”
- “你们的系统 QPS 和响应时间大概是多少?做过压力测试吗?”
这一环节不仅要求你对项目了如指掌,更要展现出你在项目中的思考和成长。
框架
- “谈谈你对 Spring 框架的理解”,这个问题非常开放,我从 IOC 和 AOP 两个核心思想切入,阐述了它们如何解耦和简化企业级开发。
- “Spring AOP 是如何实现的?” 我回答了基于 JDK 动态代理和 CGLIB 两种方式,并说明了它们分别针对接口和类的代理机制。面试官追问:“动态代理只能用反射吗?”
- “Spring Boot 加载配置文件的优先级了解么?”我只提到当前项目根目录下
config/
子目录的配置文件优先级最高,其他的有点忘了。
分布式
- “在分布式系统中,如何生成全局唯一的 ID?”,我列举了 UUID、数据库自增、Redis 生成以及雪花算法(Snowflake)等方案,并重点分析了雪花算法的构成和优缺点。
编程语言
- “Java 里有协程(Coroutine)这个概念吗?你了解过其他语言的协程实现吗?” 这个问题考察了技术的视野和前瞻性。
- “除了 Java,还学习过其他语言吗?掌握程度如何?”
算法手撕
- 题目: 合并两个有序数组,并求出中位数 (类似 LeetCode 4. 寻找两个正序数组的中位数)
- 要求: 时间复杂度需要达到 O(log(m+n))。
- 分析: 这道题的难点在于时间复杂度的要求,暴力合并再找中位数是无法满足的。正确解法是利用二分查找的思想,在两个数组中寻找合适的分割线。这道题对算法思维的要求比一面高出不少。
二面小结
二面是压力最大的一轮,面试官非常聪明,能迅速抓住你回答中的关键点并进行延伸。这一轮的核心是考察你的项目真实性、解决问题的能力以及技术思考的深度。单纯背诵八股文很难过关,必须有自己的理解和沉淀。
HR 沟通与总结
二面的技术部分结束后,HR 进行了简短的沟通,主要是一些常规问题:
- 对工作地点有什么要求?
- 对金融和证券行业有什么了解?
- 未来的职业规划是怎样的?
- 目前有拿到其他公司的 Offer 吗?
整个过程比较轻松,主要是为了了解候选人的稳定性和求职意向。
参考资料
下面这几篇文章基本涵盖了上面提到的绝大部分面试题的参考答案(注:这部分为 Guide 补充):
- Java:
- Java 基础常见面试题总结(上)(Java 语言的基本概念、语法、数据类型、变量、方法等)
- Java 基础常见面试题总结(中)(面向对象基础、字符串、对象的比较与拷贝等)
- Java 集合常见面试题总结(下)(
HashMap
、ConcurrentHashMap
等核心集合) - Java 常见并发容器总结(
java.util.concurrent
包中提供的并发容器,例如LinkedBlockingQueue
、ConcurrentLinkedQueue
等。) - JVM 垃圾回收详解(重点)(JVM 的垃圾回收机制,包括堆空间结构、内存分配与回收原则、垃圾回收算法、以及 CMS、G1 等主流垃圾收集器的特点)
- 数据库:
- MySQL 常见面试题总结(MySQL 基础、存储引擎、事务、索引、锁、性能优化等)
- Redis 常见面试题总结(下)(Redis 事务、性能优化、生产问题、集群、使用规范等)
- 框架:
- Spring 常见面试题总结(Spring 基础、IoC、AOP、MVC、事务、循环依赖等)
- SpringBoot 常见面试总结(星球专栏《Java 面试指北》中的一篇文章)
- 分布式:分布式 ID 介绍&实现方案总结
- 系统设计:如何设计一个秒杀系统?(星球专栏《后端面试高频系统设计&场景题》中的一篇文章)
最终感想与建议
从这次面试经历来看,我总结出东方财富在招聘时比较看重以下几点:
- 扎实的基础: 无论是 Java、JVM、数据库还是网络,基础知识都是面试的重中之重。
- 深入的理解: 不仅要知其然,更要知其所以然。对框架、中间件的底层原理有深入理解会非常加分。
- 真实的项目经验: 项目经历是展示你解决问题能力的最佳舞台,一定要准备充分,能够清晰地阐述项目的背景、难点和你的贡献。
- 优秀的编码能力: 两轮技术面都有算法题,说明公司对候选人的编码基本功有明确要求。
最后,希望这篇复盘能对大家有所启发。求职之路不易,保持学习,不断沉淀,祝愿各位都能拿到心仪的 Offer!