2026年03月唯品会校招Java一面面经
面试题目
基础与并发:
- 请先做一个简单的自我介绍。
- 对于Java中的锁机制,你有什么理解?
- 在悲观锁中,Java语言层面有哪些实现方式?它们之间的区别是什么?
- synchronized和reentrant lock在等待与唤醒机制上有什么区别?
- 你对线程池的理解是怎样的?
- 在使用线程池执行任务时,一般需要注意哪些问题?
- 如何让主线程感知到线程内部的异常?
- 如果线上应用频繁出现GC问题,可能是什么原因导致的?
- Spring AOP使用的哪种设计模式及代理方式?在哪些场景下会使用Spring AOP,以及使用时应注意哪些问题?
数据库:
- InnoDB数据库中的索引使用何种数据结构,B+树和B树有何区别?
- 在MySQL中,如何通过explain查询来分析执行计划并找出性能差的原因?
- 当查询涉及到多个字段且索引设计有问题时,该如何排查和优化?
- 对于存储数据量大的表,应如何分析其性能问题并提出解决方案?
- 在处理频繁的修改和查询操作时,如何避免引发性能问题?
实习经历:
- 在对象存储中,你们采用了哪两种经典方式?
- 当时在测试环境中遇到了什么新问题?
- 为了解决这个问题,你们采取了什么优化措施?
算法题:
- 现场进行了一道Easy/Middle难度的题目。
反问环节:
- 部门业务主要是公司个性化工程平台部,负责个性化让利、触达、超级VIP体系以及用户画像和标签数据。
参考解析
1. Java锁机制与线程池
- synchronized vs ReentrantLock: synchronized是关键字,JVM层面实现,自动释放锁;ReentrantLock是API层面,需手动lock/unlock,支持公平锁、中断响应及条件变量(Condition)。
- 线程池异常感知: 可通过Future.get()捕获异常,或重写ThreadPoolExecutor的afterExecute方法,也可在Runnable/Callable中添加try-catch处理。
- GC频繁原因: 常由内存泄漏、对象创建过快(短生命周期)、堆内存过小或大对象导致,需配合jstat、jmap及GC日志分析。
2. MySQL索引与性能优化
- B+树优势: B+树非叶子节点仅存索引,磁盘I/O次数更少;叶子节点链表连接,适合范围查询和排序;查询效率更稳定。
- Explain分析: 重点关注type(连接类型,如all/range/ref)、key(实际使用索引)、rows(扫描行数)及Extra(Using filesort/temporary表示需优化)。
- 大表优化: 考虑覆盖索引、慢查询优化、分区表、分库分表、冷热数据分离或引入Elasticsearch等搜索引擎。