携程暑期实习Java后端面经
《面试题目》
4.3 一面 (50min)
- 项目经历与深挖。
- 数据库增删改查频繁时的处理方案。
- JVM调优,OOM异常排查流程。
- MySQL索引的作用,建立索引的准则及避坑指南。
- 线程池的作用、核心参数、核心线程数设置、IO密集型 vs CPU密集型。
- equals方法比较逻辑,重写equals为什么要重写hashCode。
- 哈希表put元素的工作流程。
- 如何利用AI辅助编程及Prompt Engineering技巧。
- Redis单点热点访问处理方案。
- Spring与SpringBoot的关系。
- @Transactional注解失效场景及解决方案。
- JDK新版本特性,虚拟线程(Virtual Threads)原理。
- 手撕算法:动态规划爬楼梯。
4.10 二面 (25min)
- 消息队列的使用场景、作用,为什么不能用线程池替代。
- RocketMQ消息持久化原理。
- Redis高性能原因。
- Redis单节点QPS评估及依据。
- Redis数据结构详解,重点考察ZSet底层实现及应用场景。
- 线程池核心线程数设置,初始化加载与执行时创建的区别。
- MySQL单表数据量瓶颈。
- 垃圾收集器选择,G1 Region设置影响及GC调优。
- Agent机制,短期/长期记忆实现,简历论文相关(CV与NLP关联)。
《参考解析》
- 重写equals必重写hashCode:为了保证HashMap等容器存储对象的正确性。若对象相等(equals为true),则其hashCode必须相等,否则相同的对象会被存放在不同的哈希桶中,导致查找失败。
- 线程池核心线程数设置:IO密集型建议设置为 2*CPU核数 或 核心数/(1-阻塞系数);CPU密集型建议设置为 CPU核数+1,以减少上下文切换。
- @Transactional失效:常见于方法内部调用(非代理调用)、非public方法、异常被try-catch吞掉、或者方法抛出的是检查异常(默认回滚运行时异常)。
- Redis ZSet底层:主要由跳表(SkipList)和压缩列表(ZipList/Listpack)实现。元素较少时使用压缩列表节省空间,元素多时通过跳表实现O(logN)的查询效率。
- JVM G1调优:G1通过划分Region进行管理。Region过小会导致频繁回收,过大会降低GC灵活性。调优核心在于平衡停顿时间(Pause Time)与吞吐量。